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

如何在SwiftUI的不同视图中保存列表

在SwiftUI中,可以使用以下方法在不同视图中保存列表:

  1. 使用@State属性包装器:@State属性包装器用于在视图之间共享和保存数据。您可以在父视图中创建一个@State属性,并将其传递给子视图。子视图可以读取和修改该属性,以便在不同视图之间保存列表数据。

示例代码:

代码语言:txt
复制
struct ContentView: View {
    @State private var items: [String] = []

    var body: some View {
        VStack {
            List(items, id: \.self) { item in
                Text(item)
            }
            .padding()

            AddItemView(items: $items)
        }
    }
}

struct AddItemView: View {
    @Binding var items: [String]
    @State private var newItem: String = ""

    var body: some View {
        VStack {
            TextField("Enter item", text: $newItem)
                .textFieldStyle(RoundedBorderTextFieldStyle())
                .padding()

            Button("Add Item") {
                items.append(newItem)
                newItem = ""
            }
            .padding()
        }
    }
}

在上面的示例中,ContentView视图包含一个列表和一个AddItemView视图。items属性使用@State包装器来保存列表数据。AddItemView视图使用@Binding属性包装器来读取和修改父视图中的items属性。

  1. 使用@ObservableObject和@Published属性包装器:如果需要在多个视图之间共享和保存列表数据,可以使用ObservableObject协议和@Published属性包装器。首先,创建一个ObservableObject类,并在其中声明一个@Published属性来保存列表数据。然后,在需要访问该数据的视图中,使用@ObservedObject属性包装器来观察该ObservableObject实例。

示例代码:

代码语言:txt
复制
class ItemStore: ObservableObject {
    @Published var items: [String] = []
}

struct ContentView: View {
    @ObservedObject var itemStore = ItemStore()

    var body: some View {
        VStack {
            List(itemStore.items, id: \.self) { item in
                Text(item)
            }
            .padding()

            AddItemView(itemStore: itemStore)
        }
    }
}

struct AddItemView: View {
    @ObservedObject var itemStore: ItemStore
    @State private var newItem: String = ""

    var body: some View {
        VStack {
            TextField("Enter item", text: $newItem)
                .textFieldStyle(RoundedBorderTextFieldStyle())
                .padding()

            Button("Add Item") {
                itemStore.items.append(newItem)
                newItem = ""
            }
            .padding()
        }
    }
}

在上面的示例中,ItemStore类是一个ObservableObject,其中包含一个@Published属性items来保存列表数据。ContentView视图使用@ObservedObject属性包装器来观察itemStore实例。AddItemView视图也使用@ObservedObject属性包装器来观察相同的itemStore实例。

这些方法可以在SwiftUI中保存列表数据,并在不同视图之间共享。您可以根据实际需求选择适合您的方法。

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

相关·内容

如何在Xcode下预览含有Core Data元素的SwiftUI视图

如何在Xcode下预览含有Core Data元素的SwiftUI视图 从SwiftUI诞生之日起,预览(Canvas Preview )一直是个让开发者又爱又恨的功能。...结合两年来我在SwiftUI中使用Core Data的经验和教训,我们将在本文中探讨: •导致SwiftUI预览崩溃的部分原因•如何在之后的开发中避免类似的崩溃出现•如何在Xcode中安全可靠地预览含有...预览在Xcode中的工作原理同标准的模拟器十分接近。但为了让它可以即时响应SwiftUI视图的变化,苹果对其做出了不少的修改。...不过我们在CoreDataStack中创建的基于内存的持久化存储仍然是Sqlite类型。是将数据文件保存在/dev/null的Sqlite类型。...如果确有持久化的需要,可以使用下面的方案。将Bundle中的数据库文件保存到Catch目录中。

5.2K10
  • 在 SwiftUI 中实现视图居中的若干种方法

    在 SwiftUI 中,有很多手段可以达成此目的。本文将介绍其中的一些方法,并对每种方法背后的实现原理、适用场景以及注意事项做以说明。...HStack、VStack 在进行布局时,会为每个子视图提供四种不同的建议模式( 最小、最大、明确尺寸以及未指定 ),如果子视图在不同的模式下返回的需求尺寸是不一样的,则意味着该视图是可变尺寸视图。...().fill(.clear)在使用 SwiftUI 进行开发的过程中,Color、Rectangle 等经常被用来实现对容器的等分操作。...我为本文这种通过多种方法来解决一个问题的方式添加了【小题大作】标签,目前使用该便签的文章还有:在 Core Data 中查询和使用 count 的若干方法[6]、在 SwiftUI 视图中打开 URL...每周也会对当周博客上的新文章以及在 Twitter 上发布的 Tips 进行汇总,并通过邮件列表的形式发送给订阅者。订阅下方的 邮件列表[10],可以及时获得每周的 Tips 汇总。

    6.8K40

    在 SwiftUI 中 accessibilityChildren 视图修饰符的作用

    前言SwiftUI 为我们提供了一系列丰富的视图修饰符,用于操作视图的可访问性树。我已经介绍了其中许多,你可以在博客中找到它们。...accessibilityChildren 视图修饰符允许我们为视图创建一个可访问性容器,并使用 ViewBuilder 闭包提供的视图元素进行填充。示例让我们来看一个简单的示例。...SwiftUI 不会渲染我们通过 ViewBuilder 闭包传递的视图,它仅用于填充可访问性树的子元素。...在上述代码中,将柱状图填充颜色设为红色。您可以根据需要自行更改填充颜色。运行截图:总结今天,我们了解了 SwiftUI 为我们提供的又一个强大的可访问性视图修饰符。...SwiftUI 凭借提供如此多友好的 API,简化了我们为了使我们的应用对每个人都具有可访问性而必须做的工作,做得非常出色。

    12120

    Android开发-Listview中显示不同的视图布局

    使用场景 在重写ListView的BaseAdapter时,我们常常在getView()方法中复用convertView,以提高性能。...convertView在Item为单一的同种类型布局时,能够回收并重用,但是多个Item布局类型不同时,convertView的回收和重用会出现问题。...比如有些行为纯文本,有些行则是图文混排,这里纯文本行为一类布局,图文混排的行为第二类布局。单一类型的ListView很简单,下面着重介绍一下ListView包含多种类型视图布局的情形。...2.ListView包含不同Item的布局 我们需要做这些工作:   1)重写 getViewTypeCount() – 该方法返回多少个不同的布局   2)重写 getItemViewType...(int) – 根据position返回相应的Item   3)根据view item的类型,在getView中创建正确的convertView 3.案例 import java.util.ArrayList

    2.3K30

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

    是否有任何建议用来检测列表中的行选择,类似于 “NavigationLink”,但不导航到另一个视图(例如,显示 Sheet 或从列表中选择一个选项 )?...在使用 environmentObject 的情况下,如何避免创建实例的视图被重新计算Q:如何在避免重新计算顶层视图 body 的情况下,在不同子树的两个子视图之间共享状态( 例如 ObservableObject...阅读 SwiftUI 的动画机制[8] 一文,了解更多有关动画的内容。自适应高度 SheetQ:如何在 iOS16 中呈现与动态内容高度相匹配的 Sheet?...对于非惰性视图(如 LazyVStack ),一旦 hosting controller 的视图被初始化,onAppear 将被调用。...在 SwiftUI 4 中,紧凑和常规分别对应着 NavigationStack 和 NavigationSplitView 两种不同的控件。两者有着完全不同的驱动模式。

    12.3K20

    Python中的列表和Java中的数组有什么不同?

    Python中的列表和Java中的数组在多种编程语言中都是常见的数据结构。虽然两者在某些方面有相似之处,但也存在许多显著的区别。...下面将对Python中的列表和Java中的数组进行比较,以帮助理解它们之间的差异。 1、类型限制 Java中的数组具有固定的数据类型,例如整数、字符或浮点数等。...而Python中的列表可以包含任何类型的数据,如整数、字符串、布尔值、函数,甚至是其他列表和元组等。虽然与Java不同,但这使得Python列表非常灵活。...4、迭代和枚举 Python中的列表提供了强大的内置支持来轻松地迭代或枚举元素。我们可以通过循环语句依次访问列表元素,并且Python还提供了一种称为“列表推导式”的快速方法来创建新的列表。...6、内建函数和方法 Python列表和Java数组都有其自己的一部分特定于该数据结构的内置函数和方法。Python提供了许多处理列表的内置方法,如append()、pop()、remove()等。

    17010

    如何在HTML的下拉列表中包含选项?

    为了在HTML中创建下拉列表,我们使用命令,它通常用于收集用户输入的表单。为了在提交后引用表单数据,我们使用 name 属性。如果没有 name 属性,则下拉列表中将没有数据。...用于将下拉列表与标签相关联;id 属性是必需的。要在下拉列表中定义选项,我们必须在 元素中使用 标签。...价值发短信指定要发送到服务器的选项的值倍数倍数通过使用,可以一次选择多个属性选项。名字名字它用于在下拉列表中定义名称必填必填通过使用此属性,用户在提交表单之前选择一个值。...大小数此属性用于定义下拉列表中可见选项的数量价值发短信指定要发送到服务器的选项的值自动对焦自动对焦它用于在页面加载时自动获取下拉列表的焦点例以下示例在HTML的下拉列表中添加一个选项 例下面是另一个示例,演示了 标记的不同属性的使用

    27920

    【Python】列表 List ① ( 数据容器简介 | 列表 List 定义语法 | 列表中存储类型相同的元素 | 列表中存储类型不同的元素 | 列表嵌套 )

    一、数据容器简介 Python 中的 数据容器 数据类型 可以 存放多个数据 , 每个数据都称为 元素 , 容器 的 元素 类型可以是任意类型 ; Python 数据容器 根据 如下不同的特点 : 是否允许元素重复...列表定义语法 : 列表标识 : 使用 中括号 [] 作为 列表 的标识 ; 列表元素 : 列表的元素之间 , 使用逗号隔开 ; 定义 列表 字面量 : 将元素直接写在中括号中 , 多个元素之间使用逗号隔开...或者 list() 表示空列表 ; # 空列表定义 变量 = [] 变量 = list() 上述定义 列表 的语句中 , 列表中的元素类型是可以不同的 , 在同一个列表中 , 可以同时存在 字符串 和...数字类型 ; 2、代码示例 - 列表中存储类型相同的元素 代码示例 : """ 列表 List 代码示例 """ # 定义列表类 names = ["Tom", "Jerry", "Jack"] #...- 列表中存储类型不同的元素 代码示例 : """ 列表 List 代码示例 """ # 定义列表类 names = ["Tom", 18, "Jerry", 16, "Jack", 21] #

    28120

    SwiftUI TextField进阶——格式与校验

    SwiftUI修饰方法) 以上原则,在SheetKit——SwiftUI模态视图扩展库[3]和用NavigationViewKit增强SwiftUI的导航视图[4]中均有体现。...如何在TextField中实现格式化显示 现有格式化方法 在SwiftUI 3.0中,TextField新增了使用新老两种Formatter的构造方法。...如何在TextField中屏蔽无效字符 现有屏蔽字符方法 在SwiftUI中,可以通过设置仅使用特定的键盘类型来实现一定程度上的录入限制。...如何在TextField中检查内容是否符合指定条件 相较上述两个目标,在SwiftUI中检查TextField内容是否符合指定条件是相当方便的。...不利于判断用户是否录入新的信息(更多的信息可参阅如何在SwiftUI中创建一个实时响应的Form[10])。方案二中允许不提供初始值,支持可选值。

    8.2K20

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

    开始 首先看下主要内容: 在本教程中,您将了解如何在SwiftUI和Combine中使用VIPER体系结构模式,同时构建一个允许用户创建公路旅行的iOS应用程序,来自翻译。...路由器Router处理屏幕之间的导航。这与SwiftUI不同,在SwiftUI中,视图显示任何新视图。...SwiftUI有自己独特的做事方式。如果你将VIPER职责映射到域对象将会不同,如果你将它与UIKit应用的教程相比较。 1....最大的区别是,视图模型View Model与视图控制器不同,它只有对视图和模型的单向引用。MVVM非常适合SwiftUI。 VIPER更进一步,将视图逻辑与数据模型逻辑分离。...由于演示者presenter的工作是用数据填充视图,所以您希望从数据模型中公开旅程trips列表。

    17.6K10

    如何在 Helm Chart 中兼容不同的 Kubernetes 版本?

    Helm Chart 包的时候有必要考虑到对不同版本的 Kubernetes 进行兼容。...要实现对不同版本的兼容核心就是利用 Helm Chart 模板提供的内置对象 Capabilities,该对象提供了关于 Kubernetes 集群支持功能的信息,包括如下特性: Capabilities.APIVersions...版本使用方式基本一致,但是和前面的 extensions/v1beta1 这个版本在使用上有很大的不同,资源对象的属性上有一定的区别,所以要兼容不同的版本,我们就需要对模板中的 Ingress 对象做兼容处理...,首先我们在 Chart 包的 _helpers.tpl 文件中添加几个用于判断集群版本或 API 的命名模板: {{/* Allow KubeVersion to be overridden. */}...,这样我们定义的这个 Chart 模板就可以兼容 Kubernetes 的不同版本了,如果还有其他版本之间的差异,我们也可以分别判断进行定义即可,对于其他的资源对象,比如 Deployment 也可以用同样的方式进行兼容

    1.4K10

    如何在 Discourse 中批量移动主题到不同的分类中

    在社区运行一段时间以后,我们可能需要对社区的内容进行调整。 这篇文章介绍了如何在 Discourse 中批量从一个分类移动到另一个分类。...例如,我们需要将下面的主题批量从当前的分类中移动到另外一个叫做 数据库 的分类中。 操作步骤 下面描述了相关的步骤。 选择 选择你需要移动的主题。...批量操作 当你选择批量操作以后,当前的浏览器界面就会弹出一个小对话框。 在这个小对话框中,你可以选择设置分类。 选择设置分类 在随后的界面中,选择设置的分类。 然后保存就可以了。...经过上面的步骤就可以完成对主题的分类的批量移动了。 需要注意的是,主题分类的批量移动不会修改当前主题的的排序,如果你使用编辑方式在主题内调整分类的话,那么调整的主题分类将会排序到第一位。...这是因为在主题内对分类的调整方式等于修改了主题,Discourse 对主题的修改是会更新主题修改日期的,在 Discourse 首页中对页面的排序是按照主题修改后的时间进行排序的,因此会将修改后的主题排序在最前面

    1.2K00

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

    与 macOS 上的 List 相比,许多控件在 Form 中的外观和行为都有所不同。与 Form 不同的是,List 内置了对编辑模式( Edit Mode )的支持。...在更复杂的 UI 中,由于视图的更新速度过快,性能( 至少在 macOS 上 )迅速下降。A:有不同的策略。ObservableObject 是使视图或视图层次结构的失效( 引发重新计算 )的单元。...Swiftcord[12] 的代码展示了如何在 SwiftUI 下实现倒置列表。阅读 优化在 SwiftUI List 中显示大数据集的响应效率[13] 一文,了解苹果工程师推荐的方法。...将背景扩展到安全区域Q:如果我有一个自定义的容器类型,可以接受一个顶部和底部的视图,是否有办法让 API 的调用者将所提供的视图的背景扩展到安全区域内,同时将内容( 如文本或按钮 )保留在安全区域内?...macOS APIQ:对于运行 Monterey 的 Mac,能否如何在 SwiftUI 中实现下面需求的建议:打开一个窗口在该窗口中初始化数据找到所有打开的窗口确定一个窗口是否打开从不在该窗口的视图中关闭一个窗口

    14.8K30

    如何让 SwiftUI 的列表变得更加灵活

    前言 List 可能是 SwiftUI 附带的内置视图中最常用的一种,它使我们能够在任何 Apple 平台上呈现“类似于表格视图”的用户界面。...中初版的概念和 API 编写的,下面让我们尝试使用新功能来为我们的列表实现自定义样式,并且使代码更加健壮。...为了演示这种情况,我们在 List 中嵌套一个 ForEach (因为在 SwiftUI 的中,列表变化一版都是由 ForEach 触发的,而不是由 List 触发的)。...可定制的分隔符 自从引入 SwiftUI 以来,开发者们有一个非常普遍的要求,提供一个 API ,用于隐藏或以其他自定义实现列表中每个 item 之间的默认分隔符。...item 上调用的,可以为不同的分隔符设置不同的颜色。

    4.9K41

    肘子的 Swift 周报 #055| 让技术为我所用,不要被其反噬

    前一期内容|全部周报列表 原创 从基础到进阶:Swift 中的 KeyPath 完全指南[3] Fatbobman(东坡肘子)[4] 在 Swift 的世界里,KeyPath 是一个强大而又常被低估的特性...系列的第一篇,Danny Bolella 强调在设计 SwiftUI 视图时,开发者应认真思考“这个视图是用来做什么的?”...Xcode 16 中的一项新变化:在调试模式下构建 SwiftUI 应用时,所有视图都会被包裹在 AnyView 中。...这一设计初衷是通过共享构建产物,加快不同模式之间的切换,并提升预览速度。但在某些情况下(如 List ),这一处理方式可能会阻碍性能优化。...Vahter 提醒开发者留意该行为带来的影响,避免因误判而陷入调试陷阱。 Cursor 近期关于如何在苹果生态开发中使用 Cursor 的文章层出不穷,每篇文章都从不同角度分享了各自的见解和经验。

    3100

    SwiftUI 与 Core Data —— 数据获取

    这将有两个作用:数据变化后将引发与其绑定的视图进行更新由于底层数据并不保存在视图中,因此在视图存续期中 SwiftUI 可以随时创建新的视图描述实例而无需担心数据丢失虽然苹果没有公开 _makeProperty...方法的具体细节,开发者无法自行向 SwiftUI 申请数据保存地址,但可以通过在自定义的类型中( 符合 DynamicProperty 协议 )使用系统提供的符合 DynamicProperty 协议的类型...( 如 State )实现类似的效果。...这意味着,必须将需要持久化的数据( 与视图存续期一致 )保存在系统提供的 DynamicProperty 类型中。...在下一篇文章中,我们将探讨如何在 SwiftUI 中安全地响应数据,如何避免因为数据意外丢失而导致的行为异常以及应用崩溃。希望本文能够对你有所帮助。

    4.7K30
    领券