带有 Xcode 11 beta 7 的 SwiftUI 未更新 List / ForEach 的内容

2024-02-15

我一直在尝试一个简单的功能来将新条目添加到列表中。该视图只会添加一个新生成的。项目(不需要用户输入)。

struct PeopleList: View {
@ObservedObject var people: PersonStore
var body: some View {
    NavigationView {
        VStack {
            Section {
                Button(action: add) {
                    Text("Add")
                }
            }
            Section {
                List {
                    ForEach(people.people) { person in

                        NavigationLink(destination: PersonDetail(person: person)) {
                            PersonRow(person: person)
                        }
                    }
                }
            }
        }
    }
    .navigationBarTitle(Text("People"))
    .listStyle(GroupedListStyle())
}

func add() {
    let newID = (people.people.last?.id ?? 0) + 1

    self.people.people.append(Person(id: newID, name: ""))
}
}

这在以前的测试版中曾经有效,但由于某种原因它不再有效。当我单击“添加”时,应用程序会调用add()函数并将新条目添加到数组中,但视图根本没有更新。

这些是支持类:

    class PersonStore: ObservableObject {

    var people: [Person] {
        willSet {
            willChange.send()
        }
    }

    init(people: [Person] = []) {
        self.people = people
    }

    var willChange = PassthroughSubject<Void, Never>()
}

class Person: ObservableObject, Identifiable {

    var id: Int = 0 {
        willSet {
            willChange.send()
        }
    }

    var name: String {
        willSet {
            willChange.send()
        }
    }

     init(id: Int, name: String) {
        self.id = id
        self.name = name
    }

    var willChange = PassthroughSubject<Void, Never>()
}

#if DEBUG

let data = [
    Person(id: 1, name: "David"),
    Person(id: 2, name: "Anne"),
    Person(id: 3, name: "Carl"),
    Person(id: 4, name: "Amy"),
    Person(id: 5, name: "Daisy"),
    Person(id: 6, name: "Mike"),
]

#endif

以及支持观点:

struct PersonRow: View {

    @ObservedObject var person: Person

    var body: some View {
        HStack {
            Image(systemName: "\(person.id).circle")
            Text(person.name)
        }.font(.title)
    }
}

struct PersonDetail: View {

    @ObservedObject var person: Person

    var body: some View {
        HStack {

            Text("This is \(person.name)")
        }.font(.title)
    }
}

我发现有人遇到了看起来有点相关的问题:SwiftUI:如果 @ObservedObject 是 UIViewController 的子类,则视图内容不会重新加载。这是一个错误还是我错过了什么? https://stackoverflow.com/questions/57702108/swiftui-view-content-not-reloading-if-observedobject-is-a-subclass-of-uiviewco和这里:SwiftUI @Binding 不刷新视图 https://stackoverflow.com/questions/57127878/swiftui-binding-doesnt-refresh-view


问题在于,当您实现自己的 ObservableObject 时,您使用了错误的发布者。 ObservableObject 协议创建了 objectWillChange 发布者,但您从不使用它,因此 SwiftUI 永远不会被告知任何内容发生了变化。


class Person: ObservableObject, Identifiable {
    let id: Int

    @Published
    var name: String

    init(id: Int, name: String) {
        self.id = id
        self.name = name
    }
}

我还没有通过编译器运行它,因此可能存在一些拼写错误。

您不必使用@Published,但对于像您这样的简单案例来说,它更容易。当然,您还需要更新其他课程。

另一件小事是,id 必须永远不会改变,List 等人。使用它将您的数据与它们创建的视图连接起来。

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

带有 Xcode 11 beta 7 的 SwiftUI 未更新 List / ForEach 的内容 的相关文章

  • Swift:覆盖子类内的类型别名

    所以我正在考虑在我的项目中使用自定义模式 但我无法让它发挥作用 主要思想是改变typealias在每个子类上访问子类特定的接口 protocol InstanceInterface class typealias Interface var
  • Swift 类型推断和类型检查问题

    我不是在寻找如何正确执行此操作的答案 而是在寻找为什么会发生这种情况的答案 这是代码 func isInt param AnyObject if let value param as Int print value else print N
  • 使用 Swift 使用 SOAP Web 服务

    我期望从 w3schools com 返回 XML SOAP 响应 http www w3schools com webservices tempconvert asmx http wwww w3schools com webservice
  • UIDocumentInteractionController 显示空白 pdf

    我尝试使用 UIDocumentInteractionController PresentPreviewAnimated 方法在 iOS 设备上显示 pdf 但它一直显示空白文档 我认为这可能与字符编码有关 但我不确定 如果我使用 UIWe
  • 为什么 Obj-C 属性默认所有权“分配”而不是“强”

    我正在向旧项目添加 Swift 类 一切进展顺利 直到我尝试向 Swift 类添加属性 生成的标头无法编译 我认为问题是 在生成的代码中 Swift 省略了strong所有权并仅将其声明为nonatomic 这通常应该足够了 因为 prop
  • 无法在新的 Xcode 10.2 (iOS 12.2) 中构建 Alamofire 框架

    由于以下错误 我无法在 Xcode 10 2 iOS 12 2 中为 swift 5 构建 Alamofire SWIFT VERSION 3 0 is unsupported supported versions are 4 0 4 2
  • 如何在导航栏中添加右键?

    我有一个问题要在导航栏中添加右键 我有两个视图 视图 A 和视图 B 我添加了一个导航栏来查看A 之后我使用了self navigationController pushViewController显示视图 B 视图B的导航栏左侧自动显示一
  • Xcode 8 beta“错误”对于这种情况下的类型查找不明确

    根据这篇文章 我需要指定模块来查找对象类型 在此上下文中 方法 对于类型查找不明确 Alamofire 中的错误 https stackoverflow com questions 33543597 method is ambiguous
  • CSV 解析 - Swift 4

    我正在尝试解析 CSV 但遇到一些问题 下面是我用来解析 CSV 的代码 let fileURL Bundle main url forResource test application data Sheet 1 withExtension
  • 动态增加UITableViewCell中UILabel的高度?

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

    只是要警告你 我是 Swift 的新手 我仍在适应它的工作原理 我一直在尝试在课堂上完成这个计算器项目 问题是 我需要练习简化代码 现在 当按下数字按钮时 我将其保存在这样的数组中 IBAction func buttonPressed s
  • 从数组中获取随机字符串[重复]

    这个问题在这里已经有答案了 我试图从数组 firstArray 中获取随机字符串并将其打印在 UILabel label 中 我似乎无法弄清楚并且出现错误 感谢您的帮助 我尝试搜索但找不到任何最新的教程 方法 import UIKit cl
  • Swift 中的柯里化,未来会有新的声明语法吗?

    今天刚在 Linux 上安装了 Swift 来看看 尝试一个柯里化的小例子会导致警告 柯里化的语法将来会改变 但是我找不到任何关于这个新语法的信息 我尝试过的柯里化示例 func do stuff x Int y Int z Int gt
  • 检查定位服务是否开启

    我一直在对 CoreLocation 进行一些研究 最近 我遇到了一个在其他地方 但在 Objective C 和 iOS 8 中 已经讨论过的问题 我觉得问这个问题有点傻 但是如何在 iOS 9 上使用 swift 检查是否启用了位置服务
  • 在 ios 13 上未获取 APNS 设备令牌

    我有与 APNS 设备令牌相关的问题 在我使用 Xcode 10 2 和 iOS 12 1 之前 此时我曾经在委托方法中获取设备令牌 void application UIApplication application didRegiste
  • UIButton 导致无法识别的选择器发送到实例

    我正在尝试使用 for 循环创建多个按钮 但在使用 sender 函数时遇到问题 我有以下代码 func setUpButtons for i in 1 3 let btn UIButton UIButton frame CGRect x
  • 如何接收有关与我共享的记录中所做更改的 CloudKit 通知?

    我有两个 iCloud 帐户 A and B 在两个不同的设备上 来自其中之一 A 我将 ckrecord 分享给另一个人 B 像这样 let controller UICloudSharingController controller p
  • 适用于 iPhone / iPad / iOS 的快速、精益 PDF 查看器 - 提示和提示?

    最近有很多关于绘制 PDF 的问题 是的 您可以使用UIWebView但这无法提供您所期望的优秀 PDF 查看器的性能和功能 您可以绘制PDF页面到 CALayer http www cocoabuilder com archive coc
  • UIButton的高亮状态由什么控制事件开始和结束

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

    Apple 为 iOS 8 的 TouchID 实现提供的文档采用 Objective C 语言 有 Swift 版本吗 Objective C IBAction touchIDAvailable UIButton touchIDAvail

随机推荐