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

如何在视图取消SwiftUI时将选择保留在数组中

在SwiftUI中,可以使用@State属性包装器来管理视图中的状态。当视图取消时,可以通过将选择保留在数组中来实现。

首先,创建一个数组来存储选择的项目。可以使用@State属性包装器来声明数组,并初始化为空数组。

代码语言:txt
复制
@State private var selectedItems: [String] = []

接下来,在视图中创建一个列表或其他视图,用于显示可选择的项目。在每个项目上使用Toggle视图来允许用户选择或取消选择。

代码语言:txt
复制
List {
    ForEach(items, id: \.self) { item in
        Toggle(item, isOn: Binding(
            get: { self.selectedItems.contains(item) },
            set: { isSelected in
                if isSelected {
                    self.selectedItems.append(item)
                } else {
                    self.selectedItems.removeAll(where: { $0 == item })
                }
            }
        ))
    }
}

在上述代码中,items是一个包含可选择项目的数组。通过使用ForEach循环遍历数组,并为每个项目创建一个Toggle视图。isOn参数使用Binding来绑定每个项目的选择状态。

当用户选择或取消选择项目时,set闭包将被调用。如果项目被选择,则将其添加到selectedItems数组中。如果项目被取消选择,则从selectedItems数组中移除。

最后,可以在视图中使用selectedItems数组,以便在取消视图后保留选择的项目。

代码语言:txt
复制
Text("Selected items: \(selectedItems.joined(separator: ", "))")

上述代码将选择的项目作为文本显示在视图中。

这是一个基本的示例,演示了如何在视图取消时将选择保留在数组中。根据具体的需求,可以根据需要进行修改和扩展。关于SwiftUI的更多信息和示例,请参考腾讯云的SwiftUI文档

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

相关·内容

Ask Apple 2022 与 SwiftUI 有关的问答(下)

快速检索数组元素Q:为什么没有简单的方法 TABLE 选择的行映射到提供表内容的数组元素上?似乎唯一的方法是在数组搜索匹配的 id 值,这对于大表来说似乎效率很低。...A:用数组索引来存储选择是很脆弱的:如果数组发生了突变,选择就会变得不同步。Swift Collections[6] 有一个 OrderedDictionary,可能会对你有所帮助。...背景扩展到安全区域Q:如果我有一个自定义的容器类型,可以接受一个顶部和底部的视图,是否有办法让 API 的调用者所提供的视图的背景扩展到安全区域内,同时内容( 文本或按钮 )保留在安全区域内?...这意味着我们不能使用 LazyVStack,或任何其他选择与详细视图绑定的自定义视图。有扩展这个功能的计划吗?A:在 iOS 16.1 ,你可以在侧边栏里放一个。...Text 与 TextField 在编辑模式下的切换Q:在 editMode 的文档建议,在非编辑模式下,可以选择 Text 视图换成 TextField 。

14.8K30

何在SwiftUI实现interactiveDismissDisabled

何在SwiftUI实现interactiveDismissDisabled 想获得更好的阅读体验,可以访问我的博客www.fatbobman.com[1] 本文中我们探讨如何实现一个SwiftUI...去年9月,我在文章【在SwiftUI制作可以控制取消手势的Sheet】[3]中介绍了健康笔记2.0[4]版本的Sheet控制实现方法。...当用户使用手势取消Sheet,系统首先执行presentationControllerWillDismiss,然后再从presentationControllerShouldDismiss获取是否允许取消...在之前的版本[8],用户使用手势取消的通知和其他的逻辑是分离的,在使用不仅繁琐,而且影响代码的观感。本次一并解决这个问题。...delegate = delegate } }} makeUIView只需要创建一个空视图(UIView),由于在执行makeUIView,无法保证Sheet视图已经被正常展示

3.9K40
  • SheetKit——SwiftUI模态视图扩展库

    主要因为SwiftUI重要的视图展示模式:NavigationView、Sheet等都没有迅捷、简便的重置能力。很难通过一两句代码应用程序立即设置成我们想要的视图状态。...源地址[4] SheetKit每个功能的代码都集中在一到两个文件。如果只需要其中部分的功能,直接在项目中添加对应的文件或许是不错的选择。...interactiveDismissDisabled SwiftUI 3.0的interactiveDismissDisabled加强版,在通过代码控制是否允许手势取消的基础上,增加了当用户使用手势取消可以获得通知的能力...更多信息请参阅如何在SwiftUI实现interactiveDismissDisabled[5] SheetKit的interactiveDismissDisabled为了兼容bottomSheet...在SwiftUI3.0,已经可以使用原生API生成各种毛玻璃效果了。但只有模态视图的背景设置为透明,毛玻璃效果才能显现出来。

    2.9K20

    SwiftUI TextField进阶——格式与校验

    本文为【SwiftUI 进阶】系列文章的一篇,在本文中,我介绍如何在TextField实现如下功能: •屏蔽无效字符•判断录入的内容是否满足特定条件•对录入的文本实时格式化显示 textfieldDemo1...在为SwiftUI增加新功能,要求自己尽量遵守以下原则: •优先考虑能否在SwiftUI原生方法中找到解决手段•确需采用非原生方法,尽量采用非破坏性的实现,新增功能不能以牺牲原有功能为代价(需兼容官方的...SwiftUI修饰方法) 以上原则,在SheetKit——SwiftUI模态视图扩展库[3]和用NavigationViewKit增强SwiftUI的导航视图[4]均有体现。...如何在TextField实现格式化显示 现有格式化方法 在SwiftUI 3.0,TextField新增了使用新老两种Formatter的构造方法。...如何在TextField屏蔽无效字符 现有屏蔽字符方法 在SwiftUI,可以通过设置仅使用特定的键盘类型来实现一定程度上的录入限制。

    8.1K20

    SwiftUI 视图的生命周期研究

    在 app 运行后进行第一次渲染SwiftUI 依据类型树按图索骥,创建类型实例,实例的 body 根据初始状态计算视图值,并组织成视图值树。...•在 SwiftUI 生成视图值树,当发现没有对应的实例SwiftUI 会创建一个实例从而获取它的 body 结果。...极个别情况下,尽管某些视图暂时不需要参与布局与渲染,但 SwiftUI 出于效率的考量,仍然会将其保留在视图值树上。...•在 List 和 LazyVStack SwiftUI 出于效率的考虑,即使 Cell 视图移出显示范围,它的视图仍将保留在视图值树上(视图仍将存续)。...更确切的表述应该是,当视图销毁向 task 修饰器的闭包发送任务取消的信号。至于是否取消,仍由 task 的闭包自己决定。

    4.4K30

    优化在 SwiftUI List 显示大数据集的响应效率

    本文通过一个优化列表视图的案例,展现在 SwiftUI 查找问题、解决问题的思路,其中也会对 SwiftUI 视图的显式标识、@FetchRequest 的动态设置、List 的运作机制等内容有所涉及...另外如果 id 的标识值发生变化,SwiftUI 丢弃原视图(生命周期终止及重置状态)并重新创建新的视图。...使用了 id 修饰符相当于这些视图从 ForEach 拆分出来,因此丧失了优化条件。 总之,当前在数据量较大的情况下,应避免在 List 对 ForEach 的子视图使用 id 修饰符。...我们通过 SwiftUI-Introspect[7] 来实现在 List 滚动到列表两端。...获取若干最新数据,数据逆向添加入数组 在列表显示后率先移动到最底端(取消动画) 通过 refreshable 调用下一批数据,并继续逆向添加入数组 用类似的思路,还可以实现向下增量读取或者两端增量读取

    9.1K20

    何在 SwiftUI 视图中显示应用图标和版本

    前言在应用显示应用图标和版本是为用户提供快速识别应用版本和变体的好方法,无论是内部用户(测试人员或利益相关者)还是外部用户。...在本文中,我展示如何创建一个可访问的 SwiftUI 视图,既能显示应用图标和版本,又能在各种文本大小和外观下看起来都很好:获取应用图标构建视图的第一步是从主包获取应用图标。...创建 SwiftUI 视图现在让我们所有内容结合起来,创建一个 SwiftUI 视图,显示应用图标和版本:AppVersionInformationView.swiftimport SwiftUIstruct...我们学习了如何在 SwiftUI 应用显示应用图标和版本信息。...在获取到应用图标和版本信息后,我们创建了一个 SwiftUI 视图来展示这些信息。该视图使用水平堆栈(HStack)布局,应用图标和版本信息并排显示。

    15222

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

    众所周知,SwiftUI 是一个响应式框架,这意味着,当数据源发生变化时,框架会自动更新视图。同样,当我们想调整视图显示,应直接对状态进行修改。...本文解析 SwiftUI 两个由于未能贯彻响应式编程原则而导致的严重错误,并提供相应的解决方案。...这两个错误包括:通过手势取消 Sheet 后,快速右滑导航容器导致应用锁死;以及在滚动返回上层视图导致应用崩溃。...原文发表在我的博客 肘子的Swift记事本视图变化在前、状态变化在后在 SwiftUI ,某些可编程控件在执行一定的操作,会先更新视图,待视图变化完成后再修改与其对应的状态。...再次执行上述过程,您会发现在返回上层视图后,应用并不会锁死,一切都恢复了正常。然而,明显地,强迫用户点击 “Dismiss” 按钮并不是一个好的选择,特别是在没有屏蔽手势取消 Sheet 的情况下。

    680110

    SwiftUI TextField 进阶 —— 事件、焦点、键盘

    SwiftUI 3.0 ,苹果为开发者提供了一个远好于预期的解决方案,同 onSubmit 类似,可以从更高的视图层次来统一对视图中的 TextField 进行焦点的判断和管理。...TextField 变得很麻烦,而且不利于统一管理。...在 SwiftUI 3.0 之前,我们必须在主视图上另外绘制或者使用非 SwiftUI 的方式来解决问题,在 SwiftUI 3.0 ,由于添加了原生设置键盘辅助视图(下文具体介绍)的功能,解决上述问题将不再困难...同其他类型的 Toolbar 类似,SwiftUI 会干预内容的排版。•无法对同一视图中多个 TextField 分别设定辅助视图在 ToolbarItem 无法使用稍微复杂一点的判断语法。...键盘辅助视图集成到 toolbar 的逻辑也有些令人令人费解。 通过 UIKit 创建 当前阶段,通过 UIKit 来创建键盘辅助视图仍是 SwiftUI 下的最优方案。

    13.2K10

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

    众所周知,SwiftUI 是一个响应式框架,这意味着,当数据源发生变化时,框架会自动更新视图。同样,当我们想调整视图显示,应直接对状态进行修改。...本文解析 SwiftUI 两个由于未能贯彻响应式编程原则而导致的严重错误,并提供相应的解决方案。...这两个错误包括:通过手势取消 Sheet 后,快速右滑导航容器导致应用锁死;以及在滚动返回上层视图导致应用崩溃。...视图变化在前、状态变化在后 在 SwiftUI ,某些可编程控件在执行一定的操作,会先更新视图,待视图变化完成后再修改与其对应的状态。这些控件基本上都是对 UIkit(AppKit)的二次包装。...然而,明显地,强迫用户点击 “Dismiss” 按钮并不是一个好的选择,特别是在没有屏蔽手势取消 Sheet 的情况下。

    32020

    StateObject 与 ObservedObject

    视图的生存期从其被加载到视图开始,至其被从视图树上移走结束。在视图的存续期中,视图根据 source of truth ( 各种依赖源 )的变化而不断变化。...当视图加载到视图SwiftUI 会根据当时采用的实例需要绑定的状态( @State、@StateObject、onReceive 等 )托管到 SwiftUI 的托管数据池中,之后无论实例再被创建多少次...在 SwiftUI 视图添加到视图树上,调用 _makeProperty 方法需要持有的订阅关系、强引用等信息保存到 SwiftUI 内部的数据池中。...不在它的构造方法引入无关的操作可以极大地减轻系统的负担。对于数据的准备工作,可以使用 onAppear 或 task ,在视图加载进行。...了解它们内涵不仅有助于选择合适的应用场景,同时也对掌握 SwiftUI 视图的存续机制有所帮助。希望本文能够对你有所帮助。

    2.4K20

    【visionOS】从零开始创建第一个visionOS程序

    在任何SwiftUI应用,你都可以使用场景内容放到屏幕上。场景包含要在屏幕上显示的视图和控件。场景还定义了这些视图和控件出现在屏幕上的外观。...当你准备在界面显示3D内容,使用RealityView。这个SwiftUI视图作为你的RealityKit内容的容器,并允许你使用熟悉的SwiftUI技术更新内容。...当指定的手势发生在实体上SwiftUI执行提供的闭包。 下面的示例一个点击手势识别器添加到上一个示例的球体视图中。...当你的空间可见,其他应用程序仍然隐藏,但当你关闭它,它们会返回。如果你的应用程序定义了多个空格,你必须在显示一个不同的空格之前取消当前可见的空格。...如果不取消可见空间,那么当您尝试打开另一个空间,系统发出运行时警告。

    88640

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

    开始 首先看下主要内容: 在本教程,您将了解如何在SwiftUI和Combine中使用VIPER体系结构模式,同时构建一个允许用户创建公路旅行的iOS应用程序,来自翻译。...在此过程,您还将了解您的iOS项目中的SwiftUI和Combine。 打开启动项目。这包括一些代码,让你开始: 当你构建其他视图,ContentView会启动它们。...还有一个可取消订阅的集合,您稍后添加它。...当您将其放置在NavigationView,该链接将成为一个按钮,destination推送到导航堆栈上。 content块可以是任何一个SwiftUI视图。...然后directions复制到routes数组。 要使用presenter,创建一个名为TripMapView.swift的SwiftUI View。

    17.5K10

    Ask Apple 2022 与 SwiftUI 有关的问答(上)

    是否有任何建议用来检测列表的行选择,类似于 “NavigationLink”,但不导航到另一个视图(例如,显示 Sheet 或从列表中选择一个选项 )?...只有这些变量重构到视图模型中去这一种方式?A:如果在同一个视图中,有多个相互关联的 @State 属性,将他们提取到一个结构或许是好的选择。...阅读 SwiftUI 的动画机制[8] 一文,了解更多有关动画的内容。自适应高度 SheetQ:如何在 iOS16 呈现与动态内容高度相匹配的 Sheet?...对于非惰性视图 LazyVStack ),一旦 hosting controller 的视图被初始化,onAppear 将被调用。...事实上,这些视图( 惰性容器视图 )一旦被创建,其存续期持续到惰性容器被销毁为止。请阅读 SwiftUI 视图的生命周期研究[12] 了解更多内容。

    12.2K20

    使用 SwiftUI 创建一个灵活的选择

    在使用 UIKit ,我总是这种类型的视图实现为具有特定 UICollectionViewFlowLayout 的 UICollectionView。但在 SwiftUI 该如何实现呢?...让我们来看看使用 SwiftUI 创建灵活选择器的实现! 可选择协议 选择器的最重要部分是,我们可以通过该视图组件选择一些所需的选项。因此,首先创建了一个 Selectable 协议。...每个数组包含能够适应同一 HStack 的项目的项目。逻辑很简单。...如果结果小于 0,这意味着我们无法下一个元素放入给定行,因此我们 singleLineResult 附加到 allLinesResult singleLineResult 设置为仅由当前元素组成的数组...然后,详细介绍了实现该选择器的逻辑,包括如何处理选项的布局、宽度和高度,以及如何处理用户与按钮的交互。 最后,提供了一个简单的视图实现,可以在 SwiftUI 中使用该选择器。

    28020

    SwiftUI 的内容边距

    不幸的是,我们在 SwiftUI 无法访问 readableContentGuide。...但是它将滚动条保留在视图的后导边缘。contentMargins 视图修饰符接受几个参数,允许我们调整其行为。第一个参数是我们想要移动的边缘。...你可以在 Playground 运行此代码以查看结果。总结本文介绍了 SwiftUI 的内容边距管理,通过对比安全区域的概念,解释了内容边距的重要性。...随后,通过介绍 UIKit 的 readableContentGuide 布局指南以及 SwiftUI 的 safeAreaPadding 视图修饰符,展示了在 iPad 上适配内容边距的方法。...最后,引入了 contentMargins 视图修饰符,并详细解释了其用法和参数,以及如何使用它来管理内容边距。通过本文,读者可以更好地理解并掌握 SwiftUI 内容边距的管理技巧。

    16432

    掌握 SwiftUI 的 task 修饰器

    当满足了需要停止由 task 修饰器创建的异步任务条件SwiftUI 会给该任务发送任务取消信号,任务必须自行响应该信号并停止作业。...在以下两种情况下,SwiftUI 会给由 task 创建的异步任务发送任务取消信号:视图( task 修饰器绑定的视图 )满足 onDisappear 触发条件绑定的值发生变化时( 采用 task 观察值变化时...)为了让之前的代码可以响应取消信号,我们需做如下调整:// while true {// 修改成 while !...作为一个事件源类型的 Source of Truth,每当接收到一个新的消息,它都会导致 SwiftUI视图的 body 重新求值。...请阅读 避免 SwiftUI 视图的重复计算[4] 一文,以了解更多有关事件源方面的内容如果,你想有选择性的处理消息,可以考虑用 task 来代替 onReceive,例如:struct NotificationHandlerDemo

    2.2K30

    SwiftUI 创建自适应的程序化导航方案

    使用数组( NavigationPath 也是对 Hashable 数组的一种包装 )作为状态的表现形式。在栈推送和弹出数据的过程对应了导航容器添加和移除视图的操作。...不过仅有在前两列通过 List(selection:) 来修改状态,才能在自动转换的 NavigationStack 表现形式具备程序化导航的能力。方案一对此有进一步的说明。...取消选中高亮 // 可以用类似的方式,改善当 contentID 变化后,content 列仍会有灰色选择提示的问题 DispatchQueue.main.asyncAfter...比如在本例的 Content 列代码,为了维持这个限定,只能通过 overlay 来定义占位视图。如果代码调整成如下样式,则会在转换后丧失程序化导航的能力( 无法通过修改状态,返回上层视图 )。...不要忘记 NavigationStack 的根视图不在它的“栈”数据在本例,转换至 NavigationStack ,需要将 Detail 列声明的视图添加到“栈”的底端。反过来则将其移除。

    4.2K30

    onAppear 的调用时机

    image-20230328163706115 请忽略例子的写法是否合理和值得推荐,仅考虑为什么在第一段代码,出现了数组越界的情况;以及第二段代码可以正确运行。...当视图的依赖( Source of truth )发生变化后,SwiftUI 会重新计算视图结果值,并与旧值进行比较。发生变化,则用新值替换旧值。...在写 SwiftUI 视图的生命周期研究[6] 一文,我们只能通过现象来推断 onAppear 的调用时机,随着版本的不断提高,SwiftUI 4 为我们提供了足够的工具让我们可以获得更加确实的证据...sizeThatFits 与 Layout 协议的 sizeThatFits 调用时机一致,都是在布局过程,父视图向子视图询问需求尺寸访问。...第一段代码 对 VStack 进行求值 计算到 Text ,创建 Text 实例 创建实例,需要调用 getWord 来获取参数 此时由于 newWords 数组为空,因此出现数组越界的错误 也就是说

    1.1K10

    onAppear 的调用时机

    图片请忽略例子的写法是否合理和值得推荐,仅考虑为什么在第一段代码,出现了数组越界的情况;以及第二段代码可以正确运行。...当视图的依赖( Source of truth )发生变化后,SwiftUI 会重新计算视图结果值,并与旧值进行比较。发生变化,则用新值替换旧值。...在写 SwiftUI 视图的生命周期研究 一文,我们只能通过现象来推断 onAppear 的调用时机,随着版本的不断提高,SwiftUI 4 为我们提供了足够的工具让我们可以获得更加确实的证据。...第一段代码对 VStack 进行求值计算到 Text ,创建 Text 实例创建实例,需要调用 getWord 来获取参数此时由于 newWords 数组为空,因此出现数组越界的错误也就是说,在第一段代码报错...,此时 newWords 已经有值了,ForEach 正常处理所有的子视图总结在本文中,我们通过 SwiftUI 4 提供的新工具明确了 onAppear 的调用时机,或许这是新 API 开发未曾想到的功能应用

    2.1K20
    领券