SwiftUI - 将数据传递到不同的视图

2024-04-30

我正在开发一个有 4 个不同视图的应用程序。主视图(内容视图), an AddView, an EditView,以及一个分离的DataView在一个类中,我通过一个传递所有数据可观察对象到其他意见。

在主视图中我有一个项目列表。在里面AddView我将项目添加到该列表中并从内容视图。我希望能够使用导航链接编辑添加的项目。所以从主要观点来看我想去EditView,更改值并返回内容视图我再次看到更改后的值。

你会用吗可观察对象为此还是我需要EnvironmentObject?因为此刻EditView不起作用,我无法传递数据内容视图 to EditView,所有文本字段EditView为空,值不会被传递。它的作用是传递数据AddView to 内容视图但后来不是从内容视图 to EditView.

有人可以告诉我如何将数据链接到所有视图吗?


你应该使用@EnvironmentObject。它允许共享对象,这对于与其他视图共享数据非常重要。

我正在使用一个Shopping本例中的对象。这个应用程序就像一个购物清单。整个项目可以在 GitHub 上找到here https://github.com/George-J-E/ShoppingListSwiftUIExample.

我真的希望这有用,因为它花了很长时间。这只是一个general如何使用的示例@EnvironmentObject有效地之间Views.

该应用程序如下所示:


创建项目

(can be downloaded through GitHub, see above link)

1:首先,在你的SceneDelegate.swift, 代替:

let contentView = ContentView()

with:

let contentView = ContentView().environmentObject(Shopping())

2:Xcode 现在会抱怨Shopping尚未制作,因此我们接下来将修复该问题:

class Shopping: ObservableObject {
    
    @Published var list = [
        ShoppingItem("Bread", quantity: 1),
        ShoppingItem("Milk", quantity: 2),
        ShoppingItem("Eggs", quantity: 12)
    ]
    
    func addItem(_ item: ShoppingItem) {
        list.append(item)
    }
}


class ShoppingItem: Identifiable {
    
    var name: String
    var quantity: Int
    
    init(_ name: String, quantity: Int) {
        self.name = name
        self.quantity = quantity
    }
}

3:接下来,我们想要主要内容,ContentView:

struct ContentView: View {

    @EnvironmentObject private var shopping: Shopping
    @State private var newItem: String?
    
    var body: some View {
        NavigationView {
            List {
                ForEach(shopping.list) { item in
                    NavigationLink.init(destination: EditView(currentItem: item)) {
                        HStack {
                            Text(item.name)
                            Spacer()
                            Text(String(item.quantity))
                            Spacer().frame(width: 10)
                        }
                    }
                }
                
                if newItem != nil {
                    TextField("New Item", text: $newItem.bound, onCommit: {
                        if !self.newItem!.isEmpty {
                            self.shopping.addItem(ShoppingItem(self.newItem!, quantity: 1))
                        }
                        self.newItem = nil
                    })
                }
            }
            .navigationBarTitle("Shopping List")
            .navigationBarItems(trailing: Button(action: {
                self.newItem = ""
            }, label: {
                Image(systemName: "plus.circle.fill")
                    .resizable()
                    .frame(width: 25, height: 25)
            }))
        }
    }
}

4:伴随着这个extension让可选的@State的工作(信用here https://stackoverflow.com/a/57041232/9607863,尽管这已被简化):

extension Optional where Wrapped == String {

    var bound: String {
        get {
            return self ?? ""
        }
        set {
            self = newValue
        }
    }
}

5:最后——EditView,允许您编辑购物清单中的商品名称:

struct EditView: View {

    let currentItem: ShoppingItem
    @EnvironmentObject private var shopping: Shopping
    @State private var name = ""
    
    var body: some View {
        TextField("Item", text: $name, onCommit: saveName)
            .padding()
            .background(Color.gray)
            .onAppear(perform: setName)
    }
    
    private func saveName() {
        shopping.objectWillChange.send()
        currentItem.name = name
    }
    private func setName() {
        name = currentItem.name
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SwiftUI - 将数据传递到不同的视图 的相关文章

随机推荐

  • 如何将 SVG 元素下载为 SVG 文件

    在过去的几个月里 我一直在编写处理椭球地球的代码 最近我已经完成了它 我的教授现在希望我将我制作的图表的图片作为 SVG 文件发送给他 我知道在Python中你可以在你的项目中放入几行代码来让它下载图像 但我不确定它是如何工作的JavaSc
  • Rails 3.2.2 mysql2 适配器错误

    我在让 mysql2 适配器与最新版本的 Rails 一起工作时遇到了麻烦 我刚刚生成了一个新项目 将以下内容添加到我的 gemfile 中 gem mysql2 lt 0 3 7 然后当然跑了 bundle install 我还修改了我的
  • 如何防止 iOS 独立 Web 应用程序锁定设备?

    我的原型设计服务创建独立的 不可安装的 iOS Web 应用程序 有时他们会在使用时锁定设备 主页按钮停止工作 应用程序继续工作 以下内容在设备的控制台中重复显示 通过附加到 xcode 检索 Apr 25 14 34 57 SpringB
  • Delphi 2009之前如何处理UTF-8和ANSI转换?

    在 Delphi 2009 中 我们有 RichEdit1 Lines LoadFromFile OpenDialog1 FileName TEncoding UTF8 RichEdit1 Lines SaveToFile OpenDial
  • C 可变参数函数:如何指定给 va_arg 的类型

    在像 printf 这样的函数中 我们使用stdarg h处理可变参数 void print int args va list ap va start ap args int i 0 for i 0 i
  • 使用 php 使用 Google Drive 进行断点续传

    我正在尝试使用以下文档在 php 中使用 Google Drive 进行可恢复上传 https developers google com drive v3 web manage uploads resumable https develo
  • Cordova 错误:您的 ios 平台没有 Api.js

    我正在尝试构建一个 cordova ios 应用程序 但运气不佳并且出现奇怪的错误 将此版本的 Cordova 与旧版本的 cordova ios 一起使用是 已弃用 升级到 电子邮件受保护 cdn cgi l email protecti
  • Puppet - 在迭代哈希时,如果 hiera 中不存在,则在清单中设置默认值

    我正在迭代 hiera 哈希中的许多条目 并希望通过在清单中设置默认值 例如ensure groups managehome等 并且如果 hiera 中存在重复的键 值对 则覆盖默认值 到目前为止 我尝试过的所有方法都无法获得默认值 我知道
  • c:forEach 在单个表行中显示所有内容

    目前我正在做一个项目 我需要在数据库的列中显示信息 但由于某种原因它们显示在一行中 现在显示如下 我还附上了我的 jsp 页面中的代码 table border 1 cellspacing 0 cellpadding 3 style fon
  • 主线程检查器:在后台线程上调用 UI API iOS 11 Xcode 9 GM Seed

    任何人都可以帮助我调试这个问题 从我开始使用 Xcode 9 GM 种子和 iOS 11 GM 种子开始 我的代码在控制台中向我发出警告 2017 09 18 16 22 52 872716 0530 359 20158 reports M
  • Jenkins + Cmake + JIRA = 多个相互依赖项目的 CI?

    我们的系统中有许多小项目在 Linux 上运行 Slackware 7 11 正在慢慢迁移到 RHEL 6 0 大约 50 100 个应用程序和 15 20 个库 我们几乎所有的应用程序都使用我们的一个或多个库 我们的源树看起来像这样 ap
  • Vuex - “不要在突变处理程序之外改变 vuex 存储状态”

    我正在尝试从 Firestore 初始化我的 Vuex 商店 最后一行代码context commit SET ACTIVITIES acts 是什么造成了错误 我不认为我会直接改变状态 因为我正在使用一个动作 我可能会错过什么 这是我的
  • Sonatype Nexus 3 - 记录 URL 代理请求

    我正在尝试调试代理存储库的问题 为我知道被代理的存储库中存在的工件提供 404 在我的情况下这是一个 NPM 包 我想启用日志记录 以便可以看到 Nexus 在响应该代理请求时尝试访问的 URL 但似乎找不到任何提供此输出的默认记录器 我需
  • 在 JavaScript 中检查数组是否包含 null 以外的内容?

    我有一个数组 很可能总是这样 null null null null null 有时这个数组可能会变成这样 helloworld null null null null 我知道我可以使用 for 循环 但是有没有办法使用indexOf检查数
  • AddExtension 属性在 C# 2.0 中如何工作?

    我想打开一个保存文件对话框 让用户输入文件名 如果他们忘记了 csv 扩展名 请添加它 SaveFileDialog AddExtension 属性似乎可以工作 但事实并非如此 我什至将 DefaultExt 属性设置为 csv 但仍然没有
  • 使用正则表达式验证姓名

    我正在尝试编写一个正则表达式name and surname 它们由一个或多个只能由字母组成的单词组成 我不关心首字母大写字母 I 想匹配名字和姓氏 Names Antony de Home April antony de Home Apr
  • 为每一表行创建一个 json

    我想从表中的数据创建 json 表格看起来像这样 code D5ABX0 MKT536 WAEX44 我正在使用 FOR JSON PATH 这很好 SELECT code FROM feature FOR JSON PATH 但是这个查询
  • 安全灵活的跨域会话

    我有一个问题希望你能帮忙解决 假设我在一家名为 Blammo 的假设公司工作 我们有一个名为 Log 的假设产品 我正在尝试建立一个系统 人们可以登录 logfromblammo com 并订购我们的一些产品 然后当他们准备好购买时 前往
  • NSCollectionView 单元格顺序随视图更改而更改

    我有一个包含选项卡栏设计的 macOS 应用程序 即 Tweetbot 有 4 个选项卡链接到 4 个不同的视图控制器 初始视图控制器 视图一 包含一个NSCollectionView水平显示 3 个单元格 这一切都工作正常 但是当我切换到
  • SwiftUI - 将数据传递到不同的视图

    我正在开发一个有 4 个不同视图的应用程序 主视图 内容视图 an AddView an EditView 以及一个分离的DataView在一个类中 我通过一个传递所有数据可观察对象到其他意见 在主视图中我有一个项目列表 在里面AddVie