Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios @视图中未反映的可观察模型更改_Ios_Swift_Swiftui - Fatal编程技术网

Ios @视图中未反映的可观察模型更改

Ios @视图中未反映的可观察模型更改,ios,swift,swiftui,Ios,Swift,Swiftui,下面是我在SwiftUI中测试@Observable特性的示例实现。它包含简单列表视图和详细视图 我们可以将对象添加到列表中(它们会反映在视图中)。我们可以进入详细视图并编辑名称、说明。但是,这些更改没有反映在上一个屏幕(列表)中 这不是正确的方法,还是应该只使用@EnvirnomentObject变量来获得所需的结果 import SwiftUI struct ContentView: View { @ObservedObject var model: ModelOne va

下面是我在SwiftUI中测试
@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。它不兼容。它会在上一个屏幕中随机抛出错误