访问和操作环境对象中的数组项

2023-12-13

我有一个EnvironmentObject我用来生成一个列表

class ActivityViewModel: ObservableObject {
    @Published var Activities = [Activity]()
    
    init() {
        self.Activities = ActivityService.fetchActivities()
    }
}

struct Activity: Codable {
    var Id: UUID
    var Name: String
    var Records: [Record]
    
    init(Name:String) {
        self.Id = UUID.init()
        self.Name = Name
        self.Records = [Record]()
    }
}

当我在视图中使用它时,我可以使用ForEach访问中的每个值Activities array.

我的问题是当我使用 NavigationLink 来传递这个Activity从另一个角度来看,它并没有使用EnvironmentObject

我的“父视图”代码:

ForEach(0..<activities.Activities.count, id: \.self) { activity in
    HStack {
        ActivityListItemView(activity: self.activities.Activities[activity])
    }
}

我的孩子查看代码:

struct ActivityListItemView: View {
    let activity: Activity
    
    var body: some View {
        NavigationLink(destination: ActivityDetail(Activity: activity)) {
            HStack {
                VStack {
                    HStack {
                        Text(activity.Name)
                        Text("\(activity.Records.count) records")
                    }
                }
                
                Text(">")
            }
        }
        .buttonStyle(PlainButtonStyle())
    }
}

如果我随后更新 viewModel,我需要将其复制到子视图中。但我不知道如何让它使用EnvironmentObject,而不仅仅是我传递给视图的变量。

任何帮助,将不胜感激。

编辑:添加活动类型


此方法与 Apple 在本教程中的方法类似。

https://developer.apple.com/tutorials/swiftui/handling-user-input


确认至Identifiable and Equatable.


   struct Activity: Codable, Identifiable, Equatable {
       var id: UUID
       var name: String
   //    var Records: [Record]
       
       init(Name:String) {
           self.id = UUID()
           self.name = Name
   //        self.Records = [Record]()
       }
   }

迭代一遍activity.activities并通过你的view-model and activity to ActivityListItemView

   ForEach(viewModel.activities) { activity in
     HStack {
         ActivityListItemView(viewModel: viewModel, activity: activity)
     }
 }

In ActivityListItemView,找到其活动索引

private var activityIndex: Int? {
     viewModel.activities.firstIndex(of: activity)
  }

Unwrap activityIndex并通过$viewModel.activities[index] to ActivityDetail

var body: some View {
      if let index = activityIndex {
          NavigationLink(destination: ActivityDetail(activity: $viewModel.activities[index])) {
              ...
          }
          ...
      }
  }

Use @Binding包装在ActivityDetail.


    struct ActivityDetail: View {
        @Binding var activity: Activity
        
        var body: some View {
            ...
        }
    }

一个完整的工作示例。

class ActivityViewModel: ObservableObject {
    @Published var activities = [Activity]()
    
    init() {
        self.activities = [Activity(Name: "A"), Activity(Name: "B"), Activity(Name: "C"), Activity(Name: "D"), Activity(Name: "E")]
    }
}

struct Activity: Codable, Identifiable, Equatable {
    var id: UUID
    var name: String
//    var Records: [Record]
    
    init(Name:String) {
        self.id = UUID()
        self.name = Name
//        self.Records = [Record]()
    }
}


struct ActivityView: View {
   @ObservedObject  var viewModel = ActivityViewModel()
    var body: some View {
        Button(action: {
            self.viewModel.activities.append(Activity(Name: "\(Date())"))
        }, label: {
            Text("Button")
        })
        ForEach(viewModel.activities) { activity in
            HStack {
                ActivityListItemView(viewModel: viewModel, activity: activity)
            }
        }

    }
}


struct ActivityListItemView: View {
    
    @ObservedObject var viewModel: ActivityViewModel
    
    let activity: Activity
    
    private var activityIndex: Int? {
        viewModel.activities.firstIndex(of: activity)
    }
    
    var body: some View {
        if let index = activityIndex {
            NavigationLink(destination: ActivityDetail(activity: $viewModel.activities[index])) {
                HStack {
                    VStack {
                        HStack {
                            Text(activity.name)
    //                        Text("\(activity.Records.count) records")
                        }
                    }
                    Text(">")
                }
            }
            .buttonStyle(PlainButtonStyle())
        }
    }
}


struct ActivityDetail: View {
    @Binding var activity: Activity
    
    var body: some View {
        Text("\(activity.name)")
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

访问和操作环境对象中的数组项 的相关文章

  • 如何更改某些功能以兼容 iOS 10 或更低版本的 Snapchat 中的某些功能,例如相机视图控制器

    我正在制作一个视图控制器来制作像 snapchat 相机一样的相机视图控制器 我下面的代码在 iOS 11 或更高版本上完美运行 老实说 我并没有真正掌握我的代码 因为我只是按照这个像相机视图控制器这样的 snapchat 的教程进行操作
  • 从钥匙串保存和加载 |斯威夫特[重复]

    这个问题在这里已经有答案了 如何简单地将字符串存储在钥匙串中并在需要时加载 有几种SO解决方案 主要参考Git repo 但我需要最新 Swift 上最小和最简单的解决方案 当然 我不想添加 git 框架来简单地在我的项目中存储密码 有类似
  • 如何从子 UICollectionview 内部获取 UITableView 的一部分

    我有一个UITableView with a UICollectionView在其每一行中 如下图所示 source https ashfurrow com blog putting a uicollectionview in a uita
  • 剪裁为形状的 SwiftUI 图像在上下文菜单中具有透明填充

    在我的 SwiftUI 应用程序中 我的资产目录中有一张宽高比为 1 1 的图像 在我的代码中 我有一个Image使用不同的宽高比查看 将图像裁剪为新尺寸 Image My Image resizable aspectRatio conte
  • CloudKit 获取当前用户的所有订阅

    我设法在 Apple CloudKit 中保存 更改和删除记录 我什至收到了与订阅相关的通知 但我不知道如何列出当前用户的所有订阅 到目前为止 这是我的代码 let operation CKFetchSubscriptionsOperati
  • Swift:如何在 println 之后刷新标准输出?

    如何在 Swift 中刷新标准输出println命令 也就是说 Swift 相当于什么fflush stdout in C 您可以使用 fflush stdout 导入 libc 后 if os Linux import Glibc els
  • SwiftUI - 取决于多个条件

    SwiftUI 中是否可以依赖多个条件 例如显示一个工作表 sheet isPresented stateA stateB content this is not working 或者已知有不同的方法 我只能带你去看门 c 墨菲斯 今天是运
  • 在 Swift 中将 Int 转换为 UInt32

    我正在制作一个 Tcp 客户端 因此使用CFStreamCreatePairWithSocketToHost它期望第二个参数为 UInt32 这是我正在尝试做的事情的示例 func initNetwork IP String Port In
  • iOS Swift 检测键盘事件

    我能以某种方式检测来自 iOS 键盘的事件吗 我想检测此类事件UIViewController哪个没有UITextField或任何此类物体 我只有四个圆圈UIView我想在按下键盘上的按钮时将它们涂成不同的颜色 您没有任何对象可以从键盘获取
  • 新的 FUITableViewDataSource - 如何使用?雨燕3

    刚刚更新到较新的 FirebaseUI Pod 有些事情发生了变化 但其中最大的变化之一是 FUI 表视图的工作方式 我让它在旧版本上运行良好 但在下面遇到了困难 并且缺乏文档 示例 self dataSource FUITableView
  • Firebase 连接管理器应仅返回一个结果

    我正在关注位于以下位置的文档 https www firebase com docs ios guide offline capability html section connection state https www firebase
  • iOS 内存警告

    我正在尝试使用从 Parse 数据库下载的图像填充集合视图 但我收到内存警告 然后偶尔崩溃 有谁知道其他应用程序如何设法呈现这么多图像而不崩溃 有人可以告诉我如何优化我已有的东西吗 这是所有相关代码 https gist github co
  • Swift 如何设计 UIWebView 在 Story Board 中自动调整全屏大小

    我在 StoryBoard 中设计了一个 320x500 的 UIWebView 但是当在 Iphone 6 Plus 模拟器中运行时 我想要这个 webview 全屏或随设备屏幕缩放 如何在故事板中制作它 我在 ViewDidLoad 中
  • 具有多种自定义单元格类型的 RxSwift 表视图

    我想知道是否有任何代码示例RxSwift当我可以在一个表视图中使用多个自定义单元格时 例如 我有两个部分 第一部分有 10 个单元格 类型为CellWithImage标识符和第二部分有 10 个带有类型的单元格CellWithVideo标识
  • 使用原始类型+大小写参数的 Swift Enum 的解决方法?

    我想创建 SKSpriteNodesWallType 请参阅下面的代码 并且仅当WallType is Corner通过它Side其方向的价值 枚举具有原始值 因为我需要将它们作为数字从 plist 加载 并能够随机创建它们 enum Si
  • 除了使用正则表达式之外,在 Swift 中解析 HTML

    下面是我想在 Swift 中解析的 HTML 代码 td class pinyin a href rsc audio voice pinyin pz yi1 mp3 span class mpt1 y span a a href rsc a
  • 实时获取 Apple Watch heartRateVariabilitySDNN 吗?

    我正在使用下面的函数来获取 heartRateVariabilitySDNN 但它只获取一次并且不能像 heartbeat 那样实时计算 func HRVstart guard let quantityType HKObjectType q
  • Swift 中不再有“private init”?

    我看到很多关于使用的参考private init在 Swift 中限制对象构造 例如this http krakendev io blog the right way to write a singleton 但当我尝试时 在 Xcode
  • 当 Firebase 函数以 Swift 结束时

    我在我的应用程序中使用 Firebase 它查询大量用户并获取所需的特定数据 但是当它开始查询时 其余功能也继续运行 而不仅仅是查询 所以我无法理解当它结束时 例如在这段代码中 ref observeEventType ChildAdded
  • 如何在 SwiftUI 中同时检测链接上的点击和点击坐标?

    在我的 SwiftUI 应用程序中 文本的某些部分需要可点击 点击时 应该发生一些自定义操作 不一定要打开网页 同时我需要检测点击坐标 我打算为此使用拖动手势处理程序 我使用以下方法实现了可点击文本作为链接AttributedString

随机推荐

  • 从 ListView 到其父级的冒泡滚动事件

    在我的 WPF 应用程序中 我有一个ListView whose ScrollViewer VerticalScrollBarVisibility被设定为Disabled 它包含在一个ScrollViewer 当我尝试在ListView 外
  • 读取 HttpURLConnection InputStream - 手动缓冲区或 BufferedInputStream?

    读取 HttpURLConnection 的 InputStream 时 是否有理由使用以下其中一项而不是另一个 我已经在示例中看到了两者的使用 手动缓冲器 while length inputStream read buffer gt 0
  • Firefox 中的日期问题

    我想将页面中的日期解析为 JavascriptDate 所以我的页面中有这个 span 01 07 2012 01 04 PM span 我有 Javascript 代码可以解析迄今为止的这个值 var tagText this html
  • 如果在 JFrame 之外,Java 中的工具提示会闪烁吗?

    我正在 Java 中实现 ToolTip 以便让用户更轻松地使用该产品 尽管位于 JFrame 边界并最终位于 JFrame 外部的工具提示开始 闪烁 我已经尝试了很多东西 比如移动工具提示 使其应该位于 Jframe 内 控制绘画 使其最
  • R中绘图的最佳拟合曲线

    我在一个名为 ph 的图中有一个概率密度函数 它是在 stackoverflow 用户的帮助下从两个数据样本中得出的 以这种方式 few lt read table outcome dat head TRUE many lt read ta
  • D3.js 组件中的样式未显示在 Angular 2 中

    我正在使用 Angular 2 和 D3 js 我想显示一个红色矩形 仅当我将样式放入样式 css文件 查看这个笨蛋 当我将样式放入组件中时styles 这是行不通的 查看这个笨蛋 当我使用组件时如何让它工作styles Thanks UP
  • 向 Windows Phone 7 模拟器添加更多音乐?

    模拟器有大约 3 首歌曲 这不足以确保我正在开发的歌曲选择代码能够管理超过上述 3 首歌曲 所以只是想知道这是否可能 不幸的是 无法将歌曲添加到模拟器中 您必须使用真实设备来测试这一点
  • 如何用括号外的逗号分割字符串?

    我得到了这样格式的字符串 Wilbur Smith Billy son of John Eddie Murphy John Elvis Presley Jane Doe Jane Doe 所以基本上它是演员姓名列表 可选地在括号中加上他们的
  • 当源文件路径更改时,如何保持项目的数据库连接?

    我正在使用一个微软Access数据库在我的项目中 保存到bin文件夹 当文件路径更改时 我该怎么做才能确保与该数据库的连接 导入 System Data OleDb 公开课Form3 Dim con 作为新的 OleDb OleDbConn
  • 在所有库中导入应用程序兼容性依赖项

    我的应用程序中有 2 个模块 我想修改它们以使用 AppCompat 小部件 我必须用相同的方式扩展它们 问题是我不想向它们中的每一个添加 appcompat 依赖项 那么我怎么可能向这两个模块和我的应用程序添加依赖项 如果我添加 comp
  • 如何防止点击标签时页面刷新?

    我需要将一个参数传递到 URL 中 同时阻止页面在单击任何一个时重新加载 a 带有空白的标签href属性 a href 有没有办法用 JS jQuery 来做到这一点 我已经有了这个 jQuery list group item a cli
  • SQL 计数和组

    我有一个与此类似的 MySQL db 表 id date class more info one more info two etc 1 2017 05 03 1 2 2017 05 03 3 3 2017 05 11 1 4 2017 0
  • 在客户端验证行比使用整个主键的二级索引更好?

    在 cassandra 中 众所周知 应该非常谨慎地使用二级索引 例如 如果我有一张桌子 User username usertype email etc 这里的用户名是分区键 现在我想支持当且仅当 usertype 是特定值 X 时返回特
  • 接收方未注册异常错误?

    在我的开发者控制台中 人们不断报告一个错误 我无法在我拥有的任何手机上重现该错误 一个人留言说 当他们尝试打开我的电池服务的设置屏幕时 他收到了消息 正如您从错误中看到的 它表明接收器未注册 java lang RuntimeExcepti
  • Facebook API:所有朋友共享的所有链接?

    访问所有用户 Facebook 好友共享的链接的最实用方法是什么 我希望抓取由经过身份验证的用户的朋友共享的少数域的所有链接 有没有办法询问 域 X 的所有链接 所有链接 我将过滤域 X 或者我是否需要获取每个朋友并解析每个单独的提要 我假
  • T-SQL 读取带有命名空间的 xml 文件

    我尝试读取 sql server 中的 xml 文件 DECLARE XMLToParse XML Load the XML data in to a variable to work with This would typically b
  • TypeScript 2:非类型化 npm 模块的自定义类型

    尝试后发布的建议其他地方 我发现自己无法运行使用非类型化 NPM 模块的打字稿项目 下面是一个最小的示例和我尝试的步骤 对于这个最小的例子 我们假设lodash没有现有的类型定义 因此 我们将忽略该包 types lodash并尝试手动添加
  • 如何更改powershell控制台中的光标位置

    我目前将当前的 CursorPosition 分配给 Powershell 中的一个变量 以便在脚本中执行倒计时时可以覆盖相同的空间 如下所示 errorPos host UI RawUI CursorPosition for i 5 i
  • 在 Core Data 应用程序中更新 NSTableView 的正确方法

    我有一个带有 NSTableView 的核心数据项目 其中列绑定到 NSArrayController 反过来 控制器的内容绑定到 AppDelegate 的主要托管对象上下文 我对 NSTextFieldCell 进行了子类化 以提供更定
  • 访问和操作环境对象中的数组项

    我有一个EnvironmentObject我用来生成一个列表 class ActivityViewModel ObservableObject Published var Activities Activity init self Acti