首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用SwiftUI,我们在列表中安装了一个按钮。为什么当我点击按钮以显示模式,然后再次关闭它时,模式会消失?

点击按钮显示模态视图后,再次关闭它时,模态视图会消失的原因是因为按钮点击事件触发了视图状态的改变,导致模态视图的显示与隐藏发生了变化。

在SwiftUI中,视图状态是由@State属性包装器来管理的。当按钮被点击时,按钮的点击事件会改变@State属性的值,从而触发视图的重新渲染。在模态视图显示时,@State属性的值被设置为true,从而显示模态视图;当再次点击按钮关闭模态视图时,@State属性的值被设置为false,导致模态视图消失。

要解决这个问题,可以使用@Binding属性包装器来将模态视图的显示状态与按钮的点击事件进行绑定。首先,在父视图中创建一个@State属性来管理模态视图的显示状态,并将其作为@Binding参数传递给子视图。然后,将按钮的点击事件改为修改@Binding属性的值。这样,在点击按钮时,按钮事件改变了@Binding属性的值,从而触发视图的重新渲染,但模态视图的显示状态仍然保持不变。

以下是示例代码:

代码语言:txt
复制
struct ContentView: View {
    @State private var isModalVisible = false
    
    var body: some View {
        VStack {
            Button("Show Modal") {
                self.isModalVisible = true
            }
        }
        .sheet(isPresented: $isModalVisible) {
            ModalView(isModalVisible: self.$isModalVisible)
        }
    }
}

struct ModalView: View {
    @Binding var isModalVisible: Bool
    
    var body: some View {
        VStack {
            Text("Modal View")
            Button("Close") {
                self.isModalVisible = false
            }
        }
    }
}

在这个例子中,当点击按钮时,isModalVisible属性的值会改变,从而触发模态视图的显示;当点击模态视图中的关闭按钮时,isModalVisible属性的值被修改为false,从而关闭模态视图。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

解析 SwiftUI 中两处由状态更新滞后引发的严重 Bug

众所周知,SwiftUI 是一个响应式框架,这意味着,当数据源发生变化时,框架会自动更新视图。同样,当我们想调整视图显示时,应直接对状态进行修改。...原文发表在我的博客 肘子的Swift记事本视图变化在前、状态变化在后在 SwiftUI 中,某些可编程控件在执行一定的操作时,会先更新视图,待视图变化完成后再修改与其对应的状态。...它的复现条件非常简单:在真机上测试( 模拟器上不容易复现 )点击 “GO” 按钮进入下一层视图点击 “Show Sheet” 按钮弹出 Sheet通过下滑手势取消 Sheet在 Sheet 取消后(动画结束时...再次执行上述过程,您会发现在返回上层视图后,应用并不会锁死,一切都恢复了正常。然而,明显地,强迫用户点击 “Dismiss” 按钮并不是一个好的选择,特别是在没有屏蔽手势取消 Sheet 的情况下。...它的复现条件如下:iOS 16 系统,在真机或模拟器上测试点击视图列表中的按钮,可以进入下一级视图。

760110

解析 SwiftUI 中两处由状态更新滞后引发的严重 Bug

众所周知,SwiftUI 是一个响应式框架,这意味着,当数据源发生变化时,框架会自动更新视图。同样,当我们想调整视图显示时,应直接对状态进行修改。...通过手势取消 Sheet 后,快速右滑导航容器会导致应用锁死 这是一个在 SwiftUI 所有版本中存在的错误,你可以在众多的论坛或聊天室里看到不少的开发者都在寻找解决方法。...的代码后,我们不再使用手势来取消 Sheet,而是通过点击 “Dismiss” 按钮来实现这一操作。...它的复现条件如下: iOS 16 系统,在真机或模拟器上测试 点击视图列表中的按钮,可以进入下一级视图。...因此,当我们首先更新状态,然后 SwiftUI 再响应该状态的变化(返回上层视图),即使此时对 AG 进行清理,仍将可以保证 AttributeGraph 的完整性,应用自然不会出现问题。

37020
  • AVKit框架详细解析(四) —— 基于AVKit 和 AVFoundation框架的视频流App的构建

    构建并运行以查看它的外观。 您可以看到视频播放器显示了一组基本控件。 这包括一个播放按钮、一个静音按钮和用于前进和后退的 15 秒跳过按钮。 2....play() 默认情况下,这会将您的循环剪辑显示设置为自动播放和音频关闭。 构建并运行以查看您的完整工作剪辑节目! 不幸的是,当最后一个剪辑播放完毕后,视频播放器会变黑。 3....看起来您必须以手动方式做事。 您需要做的就是跟踪您的播放器和当前播放的项目。 当它到达最后一个视频时,您将再次将所有剪辑添加到队列中。...() } 构建并运行,然后点击列表项之一以打开全屏播放器。...您会在左上角看到画中画按钮……否则不会! 缺点是,在撰写本文时,iOS 14.5是可用的最新版本,VideoPlayer 的 SwiftUI 视图未显示画中画按钮。

    7K10

    Xcode 11 初体验

    使用 Focus Mode 专注使用某一个窗口。 综合这个功能还是不错的,我经常也会打开多个页面!来回进去出来麻烦! 直接点击这个按钮,会横向进行分割。...按住 Option 按键点击它,会纵向分割, 下图是一个分割后的界面示例 上图中界面被分成了 3 个编辑窗口。左边被上下分割成了两个小窗口,右边被单独分割出一个大窗口。...当你的项目关联了版本控制工具时,比如 Git, Xcode 会检测出当前文件哪些地方相对于上次递交的版本有更改,并且会通过在左边显示一个蓝色线条标记出来: Change Bar 点击左键还可以选择 show...我下面给大家开始演示 打开项目文件,然后找到 Swift Packages 选项卡: 点击添加要导入的第三方框架,这里以 RxSwift 为 点击 Next 会执行验证,稍等片刻就会让你选择版本以及分支...Stash Changes 选择 Stash Changes 选项,会自动弹出一个对话框,提示我们输入一些Comment 信息。点击Stash 按钮自动跳转到Git管理Tab 下。

    3.2K10

    架构之路 (五) —— VIPER架构模式(一)

    开始 首先看下主要内容: 在本教程中,您将了解如何在SwiftUI和Combine中使用VIPER体系结构模式,同时构建一个允许用户创建公路旅行的iOS应用程序,来自翻译。...在本例中,主要的entity是Trip,它包含一个路点Waypoints列表,路点是旅程中的各个站点。 这个应用程序包含一个DataModel类,它包含一个旅行列表。...当将用户操作发送回数据模型时,VIPER模式甚至更有用。 为此,您将添加一个按钮来创建一个新的旅程。...当您将其放置在NavigationView中时,该链接将成为一个按钮,将destination推送到导航堆栈上。 content块可以是任何一个SwiftUI视图。...使用presenter向列表添加新路径点的add按钮。 一个列表List,它使用ForEach与presenter为每个路点创建一个单元格。

    17.6K10

    更新MacOS BigSur是遇到的常见问题及解决方案

    在启动时按住Shift键,以安全模式重启Mac。然后尝试重新安装 Big Sur。 重置NVRAM。关闭您的Mac。在按住Cmd + Option + P + R的情况下引导它。...当macOS Big Sur设置失败时,该怎么办: 按住电源按钮以强制Mac关闭。 再次按电源按钮将其启动。它现在应该启动到Big Sur。...检查电源-这听起来很简单,但这就是为什么它位于列表顶部。如果您使用的是笔记本电脑,请将其插入充电器。如果已经插入,请确保在墙上和Mac上的连接都牢固。如果使用台式机Mac,请确保电源线牢固。...如果您使用的是Mac mini或Mac Pro,或者将笔记本电脑连接到外部显示器且盖子关闭,请确保不是问题所在。检查连接。尝试在显示器关闭的情况下重新启动,然后在启动过程中将其打开。...单击系统报告,然后选择控制器。如果您的Mac具有Apple T2安全芯片,则右侧将有一个“ Apple T2芯片”。 在使用T2芯片的Mac上重置SMC 关闭您的Mac。

    5.6K20

    面向所有人的 UI 编程 :透过点按弹窗初尝 SwiftUI

    在手机应用中,软件开发者会使用不同的技术来实现界面的显示,流行的界面语言比如 Flutter,就是闲鱼应用的交互界面语言。...本文我将用如下图中的一个例子来展示如何设置点按弹窗。下图中程序的功能很简单:长按这句名言后,会出现点按弹窗,你可以点击复制按钮将这句话复制到系统剪贴板中。 ? 试想你是一名美术,完全不了解程序。...其中 View 表示一个视图,比如我们在手机上看到的一个滑条,一张图片,一个列表等种种,都叫做视图;而 Modifier 则是修饰器,它的作用是为视图增加功能,比如圆角,动画,阴影,边际,背景等等。...现在我们来观察上述代码的结构,你会发现整段代码由一个名叫 VStack 的视图和众多 Modifier 组成。 ? 那么 VStack 是什么呢?它的里面为什么会包着两个 Text 呢?...在按钮中,我们需要设置两个点:按钮的动作,也就是 action,里面的两行代码会将名言文字复制到剪贴板;另一个点是下面的 HStack ,表示一个水平排列的 View。

    2.1K40

    对话框、模态框和弹出框看起来很相似,它们有何不同?

    作为一名长期合同工,我经常改变工作环境——当我在不同的团队、公司、国家工作时,措辞都会不同。词语的含义会随着时间而改变,整个世界都是这样……这很正常!...然后我们将讨论在网页或网络程序中同时使用这些特征时我们会得到什么:对话框、弹出窗口、覆盖物和揭示框。希望当我们首先详细讨论特性时,更容易区分组件本身。...当内容可以折叠时,键盘用户应该能够使用与鼠标用户点击折叠内容的按钮相同的按钮。 主要模式 让我们看看一些常见的模式以及如何区分它们。...CMS 界面,发布按钮变暗,右下角有一个绿色框,上面写着“文档已发布”,该框右侧有一个带有关闭图标的按钮 图片 几秒钟后自动消失的“Toast”通知,还有一个关闭按钮,以防您希望它现在消失(大多数Toast...如果存在多个按钮,可能是其中最不破坏性的一个,例如如果有“取消”和“确认”按钮,一个合理的默认选项可能是“取消”。 当模式对话框关闭时:如果用户触发它,将焦点移回触发器。

    4K00

    AutoJs6 – v6.2.0 – 安卓 JavaScript 自动化工具 (Auto.js 二次开发)

    修复 关于页面功能按钮文本长度过大导致文本显示不完全的问题 修复 主页抽屉设置项标题长度过大导致文本与按钮重叠的问题 修复 主页抽屉权限开关在提示消息对话框消失后可能出现状态未同步的问题 修复...Root 权限修改主页抽屉权限开关失败时未继续弹出 ADB 工具对话框的问题 修复 Root 权限显示指针位置在初次使用时提示无权限的问题 修复 图标选择页面的图标元素排版异常 修复 文本编辑器启动时可能因夜间模式设置导致闪屏的问题...布局层次分析时长按列表项可能导致弹出菜单溢出下方屏幕的问题 修复 安卓 7.x 系统在夜间模式关闭时导航栏按钮难以辨识的问题 修复 http.post 等方法可能出现的请求未关闭异常 修复 colors.toString...方法在 Alpha 通道为 0 时其通道信息在结果中丢失的问题 优化 重定向 Auto.js 4.x 版本的公有类以实现尽可能的向下兼容 (程度有限) 优化 合并全部项目模块避免可能的循环引用等问题...(悬浮窗跟随应用主题, 快速设置面板跟随系统主题) 优化 布局控件信息列表按可能的使用频率重新排序 优化 布局控件信息点击复制时根据选择器类型自动优化输出格式 优化 使用悬浮窗选择文件时按返回键可返回至上级目录而非直接关闭悬浮窗

    4.8K20

    【愚公系列】《AIGC辅助软件开发》013-AI辅助客户端编程:AI辅助 iOS 应用开发

    **实践**: - 在按钮点击时,添加一个视图出现或消失的动画。 - 为列表中的项目添加删除动画。### 4....- 使用 `ProgressView` 在登录时显示加载指示器,登录完成后显示 "Login" 按钮。4....`Button`- **功能**:`Button` 是 SwiftUI 中的视图组件,用于创建可点击的按钮。在示例中,`Button(action: {...})` 定义了一个带有点击事件的按钮。...在示例中,当用户点击登录按钮时,`ProgressView` 显示一个圆形加载指示器。### 16. `disabled`- **功能**:`disabled` 是一个视图修饰符,用于禁用用户交互。...我一直好奇,这个容器为什么会自动居中显示,而没有居中显示的代码,我怀疑可能是.padding()”的效果导致的,我们来验证一下:.padding()怎么理解?

    9010

    树莓派使用Android系统

    点击 "选择目标 "按钮,选择SD卡。如果只插入了一个可写设备,Etcher软件会自动选择它。 3. 最后,点击 "Flash!"按钮,开始将镜像写入SD卡。...7. 7.滚动到底部,找到 "开发者选项",然后点击它。 8. 有两个不同的选项,我们需要在这个页面中进行配置。首先,向下滚动,直到你看到 "Root access",然后点击它。 9....取而代之的是,使用一个特殊的bash脚本来重命名分区,以便可以在恢复模式下启动和退出。 1. 首先,需要回到安卓界面的应用库中。同样,可以通过从屏幕底部向上拖动来实现。 2....指定你要使用的语言(1。默认情况下,设置为英语。选择好后,点击 "START "按钮开始设置过程。 2. 由于是第一次启动安装了谷歌应用和安卓系统的Raspberry Pi,所以会检查和安装更新。...现在可以打开和关闭某些谷歌服务。配置好每个服务后,滚动到底部,然后点击 "接受 "按钮。 7. 在此页面上,可以配置您的设备需要使用密码。为了简单起见,继续本教程,选择 "不是现在 "选项。

    16.2K20

    如何结合 Core Data 和 SwiftUI

    为了进行试用,请点击 “Add Entity” 按钮创建一个新实体,然后双击其名称将其重命名为 “Student”。...如果我们对 Core Data 说“这不是必须的”(您可以在模型编辑器中完成),它仍然会生成可选的 Swift 属性,因为所有 Core Data 关心的是属性在保存时具有值——在其他时间它们可以为 nil...为了解决这个问题,我们将在列表下方创建一个按钮,每次点击都会添加一个新的随机学生,但是首先我们需要一个新属性来存储托管对象上下文。 让我重申一下,因为这很重要。...当我们定义 “Student” 实体时,实际上发生的是 Core Data 为我们创建了一个类,该类继承自其自身的一个类:NSManagedObject。...这是一个引发函数的调用,因为理论上它可能会失败。实际上,我们所做的一切都没有失败的可能,因此我们可以使用try?来调用它——–我们不在乎捕获错误。 因此,请将最后一行添加到按钮的操作中: try?

    11.8K30

    【说站】win10系统打开网页不是私密连接怎么解决?

    如果您安装了此扩展程序,我们强烈建议您将其禁用或删除它,并检查是否可以解决问题。...2、当“设置”选项卡打开时,一直向下滚动并单击“显示高级设置”。 3、在“隐私”部分中,单击“清除浏览数据”按钮。 4、在“从以下菜单中清除以下项目”中,选择时间的开始。...这很简单,您可以按照以下步骤操作: 1、打开设置选项卡,然后单击显示高级设置。 2、一直向下滚动,然后在“重置设置”部分中,单击“重置设置”按钮。 3、现在将出现一个确认对话框。...从结果列表中选择。 2、当“网络和共享中心”打开时,单击左窗格中的“更改高级共享设置”。 3、现在将显示“高级共享设置”窗口。关闭网络发现,文件和打印机共享以及公用文件夹共享。打开密码保护的共享。...点击保存更改按钮。 4、之后,请尝试再次访问该网站,并检查是否会出现错误消息。 方法十一:检查您的带宽限制 如果您使用的网络连接有每月限制,则可能要检查网络使用情况。

    10.6K20

    安卓软件开发:使用Jetpack Compose实现DrawerMenuApp

    • onItemSelected:一个回调函数,用于处理用户点击菜单项时的逻辑。它接收一个 DrawerScreen 对象,表示用户选中的菜单项。...• 在代码中,我们通过 ModalDrawerSheet 包裹所有的菜单项,点击其中的任意一项可以触发不同的操作。...(3) 适用场景: • 比如一个购物应用中的导航栏,当用户点击左上角的菜单按钮时,抽屉滑出,显示购物车、收藏夹、账户信息等。 二....(3) 适用场景: • 比如社交类应用中的消息推送列表,当用户从侧边滑动出菜单后,浏览完内容,用户可以随时通过手势关闭,不需要再次点击关闭按钮。 3....• 这种 Drawer 不会挡住主屏幕内容,而是始终内容排显示 (3) 适用场景: • 比如在邮件应用中,你可以看到左边有固定的邮箱文件夹列表,右边是邮件内容。文件夹导航不会随着用户操作消失。

    56950

    TCA - SwiftUI 的救星?(一)

    ): 用户在 view 上的操作 (比如按下某个按钮),将会以消息的方式进行发送。...另外,当我们有更多更复杂的 Reducer 时,我们也可以选择只在某个或某几个 Reducer 上调用 .debug() 来帮助调试。...当我们在 View 之间自上向下传递数据时,尽量保证把 Store 进行细分,就能保证模块之间互不干扰。...但是,实际上在使用 TCA 做项目时,更多的情景时我们从更小的模块进行构建 (它会包含自己的一套 Feature),然后再把这些本地内容”添加“到它的上级。所以 Store 的切分将会变得自然而然。...为数据文本添加颜色 为了更好地看清数字的正负,请为数字加上颜色[13]:正数时用绿色显示,负数时用红色显示。 添加一个 Reset 按钮 除了加和减以外,添加一个重置按钮,按下后将数字复原为 0。

    3.3K30

    Windows 11 及其安卓子系统折腾记

    1、第一回合:尝试安装亚马逊应用商店 链接一:http://aka.ms/AmazonAppstore 在浏览器中打开上面的 “链接一”,会提示跳转到应用商店: 在应用商店打开了亚马逊应用商店,但是显示当前不可用...由于当前是正式版,需要切换为预览版才行,也就是加入 “Windows 预览体验计划”: 选择 Beta 渠道(本次安卓子系统仅支持这个渠道): 然后使用系统更新,更新到了 22000.282: 再次点击链接二并跳转到商店中...,终于可以安装了: 下载中: 启动: 启动后仅仅是打开了设置界面: 点击 “文件” 区域右上角的按钮,开始启动安卓子系统,不过弹出了错误弹窗,要求开启虚拟化(一个是启用虚拟机平台,一个是在 BIOS...勾上 “虚拟机平台” 然后点击确定: 应用完需要重启一下: 重启后点击启动安卓子系统应用(安装好后点击固定到开始屏幕的): 在打开的设置界面,再次点击文件栏的弹出按钮,显示正在启动子系统: 原来真的是一个文件管理应用啊...附 1:如果子系统卡住了,可以在设置界面点击关闭按钮: 附 2:Windows 11 桌面(主题:日出)

    3.4K10

    Swift入门:怎样安装Xcode和创建Playground

    Swift 2.2是对swift2.0的一个小的更新,在Swift 3中删除一些语法之前,它已经将那些语法设置为废弃使用。...本教程中的示例肯定会更有意义… 安装了Xcode?好啊!让我们开始吧… Swift Playground 简介 启动Xcode时,您将看到如下所示的内容。...寻找左下角的“Get started with a playground”按钮,然后点击它。 ?...代码在左侧窗格中,您将编辑此代码,以便在我们开始时快速完成您自己的工作。结果显示在右侧窗格中,它将显示您的Swift代码所做的工作。...这通常用于注释:您在代码中写入的注释,以帮助您理解它以后的作用。 当你输入的时候,Playground可能会自动运行代码并显示更新的结果。

    6.2K10

    酷我音乐iOS小组件适配开发实践

    如果通过点击widget中的动作打开app这个过程我们通俗点叫它拉端 就是点击widget后会产生直接把app调用起来的效果,有些开发者喜欢叫它呼起app.都一个意思,以下简称拉端操作 我们之前都了解在...从遇到问题和解决问题开始 当我们第一次新建widget的target 然后打开后, xcode会自动生成相关不同大小的小组件,也伴随着它自动生成的相关代码.如果第一次不了解小组件工作原理可以参考官方的WWDC...经过上述操作后,我们只能给小组件加一个按钮,并不能实现点击按钮触发事件,当我们点击button的时候直接拉端,根本不给我们处理这个按钮的点击机会. 这是因为小组件不支持常规按钮....Shortcuts 和 Spotlight使用此意图.只能用于一个带有Intent的按钮. 5.widgetURL和Link跳转app问题 当我们点击某些View的时候需要跳转host app,在小组件的...-> some View } 它明确标识如果并排添加多个widgetURL的话,这种行为是未定义不确定的,它默认会以最后一个添加的为准.好坑呀!

    1.1K21

    酷我音乐iOS小组件适配开发实践

    如果通过点击widget中的动作打开app这个过程我们通俗点叫它拉端 就是点击widget后会产生直接把app调用起来的效果,有些开发者喜欢叫它呼起app.都一个意思,以下简称拉端操作 我们之前都了解在...从遇到问题和解决问题开始 当我们第一次新建widget的target 然后打开后, xcode会自动生成相关不同大小的小组件,也伴随着它自动生成的相关代码.如果第一次不了解小组件工作原理可以参考官方的WWDC...经过上述操作后,我们只能给小组件加一个按钮,并不能实现点击按钮触发事件,当我们点击button的时候直接拉端,根本不给我们处理这个按钮的点击机会. 这是因为小组件不支持常规按钮....Shortcuts 和 Spotlight使用此意图.只能用于一个带有Intent的按钮. 5.widgetURL和Link跳转app问题 当我们点击某些View的时候需要跳转host app,在小组件的...-> some View } 它明确标识如果并排添加多个widgetURL的话,这种行为是未定义不确定的,它默认会以最后一个添加的为准.好坑呀!

    1.4K30
    领券