【发布时间】:2019-07-01 20:08:49
【问题描述】:
我尝试在 SwiftUI 中创建自定义类列表,但在 UI 更新方面一直遇到问题。我让我的类符合BindableObject 并且当属性更改时它正确调用didChange.send() 函数,但是更改似乎没有传递到数组,因为当我更改属性时视图没有更新我的自定义类在数组中。
这是我的意思的一个基本示例:
class Media: BindableObject, Identifiable {
typealias PublisherType = PassthroughSubject<Void, Never>
var didChange = PublisherType()
var id: Int {
didSet {
didChange.send()
}
}
var name: String {
didSet {
print("Name changed from \(oldValue) to \(self.name)")
didChange.send()
}
}
init(id: Int, name: String) {
self.id = id
self.name = name
}
}
struct ContentView : View {
@State private var media = [
Media(id: 0, name: "Name 0"),
Media(id: 1, name: "Name 1"),
Media(id: 2, name: "Name 2"),
Media(id: 3, name: "Name 3"),
]
var body: some View {
VStack {
List(media) { media in
Text(media.name)
}
HStack {
Button(action: {
self.media.first!.name = "Name \(Int.random(in: 100...199))"
}) {
Text("Change")
}
Button(action: {
self.media.append(Media(id: 4, name: "Name 4"))
}) {
Text("Add")
}
}
}
}
}
当按下“更改”按钮时,它只会更改数组中第一个媒体对象的名称,这不会导致重新渲染视图。当我按下“添加”按钮时,他将一个对象添加到数组中,因此重新渲染 UI 并显示第一个对象的更改名称(通过按下“更改”)。
现在我的问题是,如果有办法将Media 的发布者链接到Array<Media> 的发布者,那么当Media 发布者触发时,Array<Media> 发布者也会触发,从而导致视图重新渲染。
当我将Text(media.name) 移动到单独的视图中时(它将媒体作为@State 属性保存,它按预期工作,因为子视图本身请求重新渲染。
但假设我不想使用自定义视图而只想使用简单的Text 视图,有什么办法可以做到这一点吗?
【问题讨论】:
标签: swift list swiftui combine