Ios @视图中未反映的可观察模型更改
下面是我在SwiftUI中测试Ios @视图中未反映的可观察模型更改,ios,swift,swiftui,Ios,Swift,Swiftui,下面是我在SwiftUI中测试@Observable特性的示例实现。它包含简单列表视图和详细视图 我们可以将对象添加到列表中(它们会反映在视图中)。我们可以进入详细视图并编辑名称、说明。但是,这些更改没有反映在上一个屏幕(列表)中 这不是正确的方法,还是应该只使用@EnvirnomentObject变量来获得所需的结果 import SwiftUI struct ContentView: View { @ObservedObject var model: ModelOne va
@Observable
特性的示例实现。它包含简单列表视图和详细视图
我们可以将对象添加到列表中(它们会反映在视图中)。我们可以进入详细视图并编辑名称、说明。但是,这些更改没有反映在上一个屏幕(列表)中
这不是正确的方法,还是应该只使用@EnvirnomentObject
变量来获得所需的结果
import SwiftUI
struct ContentView: View {
@ObservedObject var model: ModelOne
var body: some View {
NavigationView{
List(){
ForEach(model.items,id: \.id){
item in
NavigationLink(destination: DetailView(item: item)){
VStack(alignment: .leading){
Text(item.name).lineLimit(1)
Text(item.description).lineLimit(1)
}.onAppear {
print("\(item.name)")
}
}
}
}.navigationBarTitle("List", displayMode: .inline)
.navigationBarItems(trailing: AddItem(buttonAction: {
let newItem = Items()
newItem.name = "Empty"
newItem.description = "Empty"
self.model.items.append(newItem)
}))
}
}
}
struct AddItem: View {
var buttonAction: (()->Void)
var body: some View{
Button(action: {
self.buttonAction()
}){
Text("Add")
}
}
}
class ModelOne: ObservableObject{
@Published var items: [Items] = []
}
class Items: Identifiable{
var id: UUID = UUID()
var name: String = ""
var description: String = ""
}
详细视图:
import SwiftUI
struct DetailView: View {
@ObservedObject var item: Items
var body: some View {
VStack{
TextField(item.name, text: $item.name)
TextField(item.description, text: $item.description)
}
}
}
我还没有时间测试这一点,但我认为您的“数组”类型没有改变,因此不会触发发布者。此外,您在详细信息视图中观察单个项目,但在“数组”上发布更改,我认为这不会起作用
尝试将观察到的模型传递到详细视图,并为特定项传递一个附加参数。
ContentView
中的body
正在观察model
-它没有观察行中的项,因此对特定项的更新不会触发Content中的body
的更新查看
解决此问题的最简单方法是将行移动到其自己的观察项目的struct
。这样,当项目更改时,行中的视图将更新:
struct ContentView: View {
@ObservedObject var model: ModelOne
var body: some View {
NavigationView{
List(){
ForEach(model.items,id: \.id){
item in
NavigationLink(destination: DetailView(item: item)){
Row(item:item)
}
}
}.navigationBarTitle("List", displayMode: .inline)
.navigationBarItems(trailing: AddItem(buttonAction: {
let newItem = Items()
newItem.name = "Empty"
newItem.description = "Empty"
self.model.items.append(newItem)
}))
}
}
}
struct Row: View {
@ObservedObject var item: Items
var body: some View {
NavigationLink(destination: DetailView(item: item)){
VStack(alignment: .leading){
Text(item.name).lineLimit(1)
Text(item.description).lineLimit(1)
}.onAppear {
print("\(self.item.name)")
}
}
}
}使用@EnvirnomentObject来反映变化everywhere@Lu_我知道我们可以使用@EnvirnomentObject,但即使使用Observable和ObservedObjects也应该可以。我只想知道为什么item.name、item.description中的更改不会更改列表屏幕中的文本视图。DetailView中的Tour项应该是SwiftUI知道的绑定此视图中所做的更改会影响ContentView我尝试在detailView中添加@Binding。它不兼容。它会在上一个屏幕中随机抛出错误