SwiftUI:如何迭代可绑定对象的数组?

2024-03-30

我正在尝试学习 SwiftUI 以及绑定的工作原理。

我有这段有效的代码,它显示了项目列表。当点击一个项目时,对该项目的绑定将传递到子视图:

struct ProjectsView: View {
  @ObjectBinding var state: AppState
  @State var projectName: String = ""

  var body: some View {
    NavigationView {
      List {
        ForEach(0..<state.projects.count) { index in
          NavigationLink(destination: ProjectView(project: self.$state.projects[index])) {
            Text(self.state.projects[index].title)
          }
        }
      }
      .navigationBarTitle("Projects")
    }
  }
}

子视图,我在其中使用绑定来改变项目:

struct ProjectView: View {
  @Binding var project: Project
  @State var projectName: String = ""

  var body: some View {
    VStack {
      Text(project.title)
      TextField(
        $projectName,
        placeholder: Text("Change project name"),
        onCommit: {
          self.project.title = self.projectName
          self.projectName = ""
      })
      .padding()
    }
  }
}

但是,我宁愿在不使用索引的情况下迭代项目数组(因为我想学习,并且它更易于阅读),但不确定如何将绑定传递到单个项目。我尝试了这样的方法,但是无法访问project.title,因为它是一个绑定,而不是一个字符串。

ForEach($state.projects) { project in
  NavigationLink(destination: ProjectView(project: project)) {
    Text(project.title)
  }
}

我怎样才能实现这个目标?


注意:我使用的是 Xcode 11.2,其中 @ObjectBinding 已过时(因此您需要更新以验证以下代码)。

我询问了模型,因为它可能对方法很重要。对于类似的功能,我更喜欢合并的 ObservableObject,因此模型是引用而不是值类型。

这是我根据您的场景进行调整的方法。它不完全按照您的要求,因为 ForEach 需要一些序列,但您尝试使用不受支持的类型提供它。

无论如何,您可以考虑将下面的内容作为替代方案(并且它没有索引)。它是完整的模块,因此您可以将其粘贴到 Xcode 11.2 中并在预览中进行测试。希望它会有所帮助。

Preview:

解决方案:

import SwiftUI
import Combine

class Project: ObservableObject, Identifiable {
    var id: String = UUID().uuidString
    @Published var title: String = ""

    init (title: String) {
        self.title = title
    }
}

class AppState: ObservableObject {
    @Published var projects: [Project] = []
    init(_ projects: [Project]) {
        self.projects = projects
    }
}

struct ProjectView: View {
  @ObservedObject var project: Project
  @State var projectName: String = ""

  var body: some View {
    VStack {
      Text(project.title)
      TextField("Change project name",
        text: $projectName,
        onCommit: {
          self.project.title = self.projectName
          self.projectName = ""
      })
      .padding()
    }
  }
}

struct ContentView: View {
    @ObservedObject var state: AppState = AppState([Project(title: "1"), Project(title: "2")])
    @State private var refreshed = false

    var body: some View {
        NavigationView {
            List {
                ForEach(state.projects) { project in
                  NavigationLink(destination: ProjectView(project: project)) {
                    // !!!  existance of .refreshed state property somewhere in ViewBuilder
                    //      is important to inavidate view, so below is just a demo
                    Text("Named: \(self.refreshed ? project.title : project.title)")
                  }
                  .onReceive(project.$title) { _ in
                        self.refreshed.toggle()
                    }
                }
            }
            .navigationBarTitle("Projects")
            .navigationBarItems(trailing: Button(action: {
                self.state.projects.append(Project(title: "Unknown"))
            }) {
                Text("New")
            })
        }
    }
}

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

SwiftUI:如何迭代可绑定对象的数组? 的相关文章

  • iOS 应用程序在 segue 处崩溃(断点发生在 func prepareForSegue 处)

    更新 我发现 仅通过阅读代码来调试是非常困难的 特别是在这样的情况下 https www dropbox com s ty3clsvgednzevj LoaferMap 20for 20iPhone 20copy 202 zip dl 0
  • Swift:HackerRank readLine 一个 Int 数组

    我正在玩 HackerRank 我需要从行读取整数数组的问题之一 A 1 2 3 B 1 4 7 I tried let line readLine print line 但我收到这个错误 solution swift 2 7 warnin
  • 在 Swift 3 中,当结果变得过高时如何计算阶乘? [复制]

    这个问题在这里已经有答案了 我编写了这个函数来返回给定数字的阶乘 func factorial n Int gt Int if n 0 return 1 else return n factorial n 1 print factorial
  • SwiftUI:获取动态背景颜色(深色模式或浅色模式)

    有没有一种方法可以系统地访问 SwiftUI 视图的标准动态背景颜色 无论用户处于浅色模式还是深色模式 例如 我知道以下内容可用于获取主要 例如文本 颜色 let textColor Color primary 但我没有看到任何类似的背景颜
  • 为什么 UICollectionView didSelect 方法不起作用?

    我已经创建了我的UICollectionView以编程方式 在这种情况下我的didSelectItemAtIndexPath方法根本不调用 let collectionView UICollectionView frame CGRect x
  • 如何在导航栏中添加右键?

    我有一个问题要在导航栏中添加右键 我有两个视图 视图 A 和视图 B 我添加了一个导航栏来查看A 之后我使用了self navigationController pushViewController显示视图 B 视图B的导航栏左侧自动显示一
  • Swift 完成处理程序语法

    此代码用于回答此处的问题 如何在 Swift 中发出 HTTP 请求 https stackoverflow com questions 24016142 how to make an http request in swift let u
  • 动态增加UITableViewCell中UILabel的高度?

    我有一个 UITableView 其中显示一个自定义单元格 我的单元格有两个标签和一个视图 如下图所示 我已经像这样给出了左视图的约束 项目标签限制 中心视图约束 右视图的约束 I am using a bean class to stor
  • 在 Swift 中获取 UIImage 的主颜色

    我正在尝试在 Swift 中获取 UIImage 的主颜色 并尝试移植这段代码 https stackoverflow com questions 13694618 objective c getting least used and mo
  • 对于 Swift 中的计算器

    只是要警告你 我是 Swift 的新手 我仍在适应它的工作原理 我一直在尝试在课堂上完成这个计算器项目 问题是 我需要练习简化代码 现在 当按下数字按钮时 我将其保存在这样的数组中 IBAction func buttonPressed s
  • tableView.dequeueReusableCellWithIdentifier() 导致应用程序挂起

    原帖 我们最近将我们的应用程序转换为 Swift 2 0 和 iOS9 我看到的一个奇怪的问题是调用 tableView dequeueReusableCellWithIdentifier 会导致应用程序挂在模拟器中 The code fu
  • 如何使 SFSpeechRecognizer 在 macOS 上可用?

    我正在尝试使用 Apple 的语音框架在 macOS 10 15 1 上进行语音识别 在 macOS 10 15 之前 语音识别仅在 iOS 上可用 但根据文档 https developer apple com documentation
  • Swift 中的柯里化,未来会有新的声明语法吗?

    今天刚在 Linux 上安装了 Swift 来看看 尝试一个柯里化的小例子会导致警告 柯里化的语法将来会改变 但是我找不到任何关于这个新语法的信息 我尝试过的柯里化示例 func do stuff x Int y Int z Int gt
  • 在 Cocoa OS X AVPlayer 中播放 HLS (m3u8) - Swift

    基本上我正在尝试在 Cocoa Swift 中使用 AVPlayer 播放 m3u8 HLS Live Stream 我对这门语言比较陌生 所以基本上掌握了一些示例代码 http qiita com ono matope items 23d
  • 确定 SceneKit 中 SKVideoNode 的视频大小/长宽比

    如何从 AVPlayer 获取视频的视频大小来设置节点的几何大小 例如 我有一个具有宽度和高度的 SCNPlane let planeGeo SCNPlane width 5 height 5 所以现在我实例化我的视频播放器 let vid
  • 如何使用 NSUserDefaults 在 Swift 中存储自定义类的数组?

    我有一个名为的自定义类Person当某人输入信息时 它会存储有关某人的各种属性 class Person Person dictionary variable var name String var age String var html
  • 使用完成处理程序在 Swift 中调用连续动画

    我正在制作一个可以显示化学反应动画的应用程序 每个原子都是一个 SCNSphere 并通过 SCNActions 进行动画处理 我尝试使用 runAction 中的完成处理程序在当前操作完成后调用下一个动画 因为每个原子必须做出很多不同的运
  • UIButton的高亮状态由什么控制事件开始和结束

    我正在创建类似钢琴的视图UIButton作为钢琴键 什么UIControlEvents当按钮获得和失去突出显示状态时 我应该监听以获得回调吗 我试图创建子类UIButton并添加属性观察者highlighted并且运行良好 然而 有时我需要
  • 如何让按钮闪烁?

    我试图在扫描正确时将按钮的颜色 只是闪烁 闪烁 更改为绿色 在出现问题时将按钮的颜色更改为红色 我可以用这样的视图来做到这一点 func flashBG UIView animateWithDuration 0 7 animations s
  • 根据 iOS 版本使用不同的类实现?

    iOS 11 最近添加了一个我想使用的新功能 但我仍然需要支持旧版本的 iOS 有没有一种方法可以将同一个类编写两次 并让较新版本的 iOS 使用该类的一个版本 而旧版本的 iOS 使用另一个版本 注 最初我用的是if available

随机推荐

  • 为什么即使在哈希上调用 Enumerable#find/#detect 也会返回数组?

    The 的文档Enumerable find detect http ruby doc org core 2 0 Enumerable html method i find says find ifnone nil obj block ob
  • 使用未分配的变量?

    当声明 paymentstatus 为空或在 if 语句中具有值时 我收到错误使用未分配的变量 ps 我想我已经声明了 ps 但显然我做错了什么 为什么编译器会抱怨这个 这是上下文中的错误 public IList
  • 如何求最大生成树?

    与克鲁斯卡尔最小生成树算法相反的算法是否适用 我的意思是 每一步选择最大权重 边缘 还有其他找到最大生成树的想法吗 是的 它确实 计算网络 G 的最大权生成树的一种方法 由于克鲁斯卡尔 可以总结如下 按权重将 G 的边按降序排序 令 T 为
  • Netbeans 告诉我删除 null 比较,但这会破坏我的代码

    我有以下简单的代码来模拟猫狩猎 import java util Arrays import java util LinkedList public class HuntigSaeson int hunger 4 int level 3 L
  • setInterval 似乎不起作用?

    这段代码似乎不起作用 我正在尝试创建一个可用聊天室的动态列表 每 10 秒更新一次 我还希望用户能够设置参数来过滤要显示的房间 我正在使用这段代码 但由于某种原因它似乎不起作用
  • 无法查看 Service Worker 日志

    看不到我的 Service Worker 的日志 以下是我尝试打开已注册和正在运行的服务工作人员日志的步骤 Open chrome serviceworker internals 单击开始并检查 刷新检查窗口 等待日志出现 但是 两者chr
  • 在 coreos 上启动 calicoctl 容器

    我有 CoreOS 测试版 1153 4 0 我正在尝试运行 calicoctl 来检查我的 calico 网络是否配置正确 所以我尝试使用以下命令运行 calicoctl rkt 容器rkt run quay io calico ctl我
  • Rails ActiveRecord:如何在 jsonb 上使用带双引号的绑定变量

    我有一个 postgres jsonb 查询如下 Blog where upload data gt name name 它可以工作 但会破坏构建 因为优秀的刹车员指出了可能的 SQL 注入风险 如果我使用绑定变量 Blog where u
  • 类型转换为 Dalvik 格式失败:无法执行 dex:包装器未首先正确加载

    当我在 Eclipse 中使用 Android SDK 和 AVD Manager 时 我遇到过各种奇怪的错误 就像标题中的错误一样 一般来说 我只是拔掉手机插头 然后重新插入 或者关闭并重新打开 Eclipse 但这很令人沮丧 显然Con
  • 浏览器不遵循 AJAX 响应的重定向(PHP 生成的响应使用 CAS 身份验证)

    好吧 看来我最初的问题犯了一个错误 因此 这里有一些更正 答案仍然适用 因为当协议更改为 HTTPS SSL 时 第二个重定向就会停止 就我而言 重定向发生了多次 并且浏览器不遵循第二次重定向 遵循第一个重定向 但返回错误 我一直读到包含重
  • 对于时间序列图,如何将 x 轴设置为没有周末的日历时间

    我想绘制一个时间序列 外汇期货合约的定价数据 时间给出yyyymmdd HH MM SS字符串格式 价格在double 该时间序列跨越一周多 但是 数据点的时间戳始终是工作日 是否有内置方法可以显示适当的 x 轴标签和缩放比例但没有周末 我
  • 此时无法启动异步操作

    我正在使用以下代码行调用异步操作 Task Run gt emailService SendEmail email Wait public async Task
  • Powershell - 将字符串输出为 CSV 并格式化

    我在下面给出了一个简单的例子 有谁知道我必须做什么才能将字符串输出到两列中 我的搜索在将输出格式化为 CSV 方面没有得到太多结果 请指出我正确的方向 LogFile c somefile csv Hello World Out File
  • 为什么我不能在淘汰赛中将数据连接到可观察数组

    我正在尝试将服务器中的元素添加到淘汰赛中的可观察数组中 这是我的视图模型 function ArticlesViewModel var self this this listOfReports ko observableArray self
  • jQuery:选择不为空的数据属性?

    我正在尝试选择所有具有data go to不为空的属性 我试过了 data go to 但奇怪的是 如果我这样做 它似乎会选择页面上的每个元素 Just as further reference and an up to date may
  • 直方图 ggplot:显示每个类别的每个 bin 的计数标签

    我将使用 ggplot 中的钻石数据集来说明我的观点 我想绘制价格直方图 但我想显示每次切割的每个箱的计数 这是我的代码 ggplot aes x price data diamonds df geom histogram aes fill
  • 我可以在 jQuery 中为每个动画步骤实现回调吗?

    我想在我的网站中实现一个动画 需要更新多个 DOM 元素 每个 DOM 元素都有自己的动画路径 取决于它们的位置 并且仍然有缓和的效果 如果我为每个元素调用 jQuery 的 animate 函数 队列 false 它将使每个元素与其余元素
  • UIAlertController (ActionSheet) - 无法同时满足约束[重复]

    这个问题在这里已经有答案了 每次在模拟手机中显示 UIAlertController 操作表时 我都会收到此警告 代码没什么花哨的 let action1 UIAlertAction title Action 1 style default
  • 批量替换XCode中的版权注释

    我已经在 iOS 项目上工作了一段时间 创建了数百个源文件 现在一切都完成了 我意识到一些悲伤的事情 我在开始工作之前编辑了版权文件模板 并且我的所有文件都已这种蹩脚的格式 MyClass h Created by Redwarp on 3
  • SwiftUI:如何迭代可绑定对象的数组?

    我正在尝试学习 SwiftUI 以及绑定的工作原理 我有这段有效的代码 它显示了项目列表 当点击一个项目时 对该项目的绑定将传递到子视图 struct ProjectsView View ObjectBinding var state Ap