Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.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
Swiftui 迅捷不';t更新第二个导航链接目标_Swiftui_Swiftui Navigationlink - Fatal编程技术网

Swiftui 迅捷不';t更新第二个导航链接目标

Swiftui 迅捷不';t更新第二个导航链接目标,swiftui,swiftui-navigationlink,Swiftui,Swiftui Navigationlink,我有一个列表,其中包含推送视图的行。该视图有另一个列表,该列表推送另一个视图。原始列表和第一个推送列表将在数据更改时更新。但是,最后一个视图在按下时不会更新。当我刷回视图时,视图不再更新,即使它曾经更新过 家庭视图>用户视图>项目视图 用户和项目是可识别的结构。我尝试过使它们可散列并使用id:\.self,但这似乎也不起作用 类应用程序:可观察对象{ @已发布的变量用户=[User]() } 结构HomeView{ @环境对象变量app:app 变位体{ 名单{ 部分{ ForEach(app.

我有一个列表,其中包含推送视图的行。该视图有另一个列表,该列表推送另一个视图。原始列表和第一个推送列表将在数据更改时更新。但是,最后一个视图在按下时不会更新。当我刷回视图时,视图不再更新,即使它曾经更新过

家庭视图>用户视图>项目视图

用户和项目是可识别的结构。我尝试过使它们可散列并使用
id:\.self
,但这似乎也不起作用

类应用程序:可观察对象{
@已发布的变量用户=[User]()
}
结构HomeView{
@环境对象变量app:app
变位体{
名单{
部分{
ForEach(app.users){中的用户
导航链接(目的地:用户视图(用户:用户)){
文本(用户名)
}
}
}
}
}
}
//当'app.users'更新时,更新正常
//从ItemView返回后停止更新
结构用户视图{
让用户:用户
变位体{
名单{
部分{
ForEach(user.items){item在
导航链接(目标:项目视图(用户:用户,项目:项目)){
文本(项目名称)
}
}
}
}
}
}
///app.users更新时不更新
结构项目视图{
让用户:用户
让项目:项目
变位体{
名单{
部分{
ForEach(item.details){详细信息见
文本(细节)
}
}
}
}
}

这是我做的测试,运行良好,一切都按预期更新

struct User: Identifiable {
    var id: String
    var name: String
    var items: [Item]
}

struct Item: Identifiable {
    var id: String
    var name: String
    var details: [String]
}

class App: ObservableObject {
    @Published var users = [User]()

    init() {
    let items1 = [Item(id: UUID().uuidString, name: "item1", details: ["d1","d2"]), Item(id: UUID().uuidString, name: "item2", details: ["d3","d4"])]
    let items2 = [Item(id: UUID().uuidString, name: "item3", details: ["e1","e2"]), Item(id: UUID().uuidString, name: "item4", details: ["e3","e4"])]
    users.append(User(id: UUID().uuidString, name: "user1", items: items1))
    users.append(User(id: UUID().uuidString, name: "user2", items: items2))
    }
}


struct ContentView: View {

@ObservedObject var app = App()

var body: some View {
    NavigationView {
        List {
            ForEach(app.users) { user in
                NavigationLink(destination: UserView(user: user)) {
                    Text(user.name)
                }
            }
        }
    }
}
}


struct UserView: View {
@State var user: User

var body: some View {
    List {
        ForEach(user.items) { item in
            NavigationLink(destination: ItemView(item: item)) {
                Text(item.name)
            }
        }
    }
}
}

struct ItemView: View {
@State var item: Item

var body: some View {
    List {
        ForEach(item.details, id: \.self) { detail in
            Text(detail)
        }
    }
}
}

好了,我想我开始明白你想要什么了。像这样的怎么样:

struct ContentView: View {

@EnvironmentObject var app: App

var body: some View {
    NavigationView {
        List(0..<app.users.count) { i in
            NavigationLink(destination: UserView(user: self.$app.users[i])) {
                Text(self.app.users[i].name)
            }
        }
    }
}


struct UserView: View {
@Binding var user: User
var body: some View {
    List(0..<user.items.count) { i in
            NavigationLink(destination:
            ItemView(item: self.$user.items[i])) {
                Text(self.user.items[i].name)
            }
        }

}
}

struct ItemView: View {
@Binding var item: Item
@State var hasChanged = false
var body: some View {
    VStack {
        Button(action: {
            self.item.details.append(contentsOf: ["wx","wy"])
            self.hasChanged.toggle()
        }) {
            Text("Add an item")
        }
        List(0..<item.details.count, id: \.self) { i in
            Text(self.item.details[i])
        }
    }
}
}
struct ContentView:View{
@环境对象变量app:app
var body:一些观点{
导航视图{

列表(0..经过长时间的搜索,我找到了一些我在互联网上其他地方还没有看到的东西。我正在从父视图中使用@State初始化我的视图,并使用onReceive进行更新。此外,onReceive/onAppear检查该项是否仍然有效,如果需要,会弹出该视图。使用init设置状态和m可能更正确别出声

主要原因是删除导致了崩溃。下面是一个完整的示例,我用来测试更改和删除源代码

struct项:可识别{
变量id:String
变量名称:String
var账户:[账户]
}
结构帐户:可识别{
变量id:String
变量名称:String
}
类应用程序:ObserveObject{
@已发布的var项目:[项目]=[
项目(id:“a”,名称:“a”,账户:[
账户(id:“1”,名称:“1”),
账户(id:“2”,名称:“2”),
账户(id:“3”,名称:“3”)
])
]
}
结构RootView:View{
var body:一些观点{
导航视图{
ContentView().environmentObject(应用程序())
}
}
}
结构ContentView:View{
@环境对象变量app:app
var body:一些观点{
名单{
ForEach(app.items){item in
导航链接(目的地:项目视图(项目:项目)){
文本(“\(item.id)-\(item.name)”)
}
}
按钮(操作:{self.app.items[0].name=“XXX”}){
文本(“更改项目名称”)
}
按钮(操作:{self.app.items=[]}){
文本(“清晰”)
}
}
}
}
结构项目视图:视图{
@环境(\.presentationMode)变量presentationMode
@环境对象变量app:app
@状态变量项:项
var body:一些观点{
名单{
文本(“\(item.id)-\(item.name)”)
ForEach(项目.账户){
导航链接(目标:AccountView(项目:self.item,帐户:account)){
文本(“\(account.id)-\(account.name)”)
}
}
按钮(操作:{self.app.items[0].name=“XXX”}){
文本(“更改项目名称”)
}
按钮(操作:{self.app.items[0]。帐户[0]。name=“AAA”}){
文本(“更改帐户名称”)
}
按钮(操作:{self.app.items=[]}){
文本(“清晰”)
}
}
.onReceive(app.$items){中的项目
guard let item=items.first(其中:{$0.id==self.item.id})else{
self.presentationMode.wrappedValue.discouse()文件
返回
}
self.item=项目
}
奥纳佩尔先生{
if!self.app.items.contains(其中:{$0.id==self.item.id}){
self.presentationMode.wrappedValue.discouse()文件
}
}
}
}
结构AccountView:视图{
@环境(\.presentationMode)变量presentationMode
@环境对象变量app:app
@状态变量项:项
@状态变量帐户:帐户
var body:一些观点{
名单{
文本(“\(item.id)-\(item.name)”)
文本(“\(account.id)-\(account.name)”)
按钮(操作:{self.app.items[0].name=“XXX”}){
文本(“更改项目名称”)
}
按钮(操作:{self.app.items[0]。帐户[0]。name=“AAA”}){
文本(“更改帐户名称”)
}
按钮(操作:{self.app.items=[]}){
文本(“清晰”)
}
}
.onReceive(app.$items){中的项目
警卫
让item=items.first(其中:{$0.id==self.item.id}),
让account=item.accounts.first(其中:{$0.id==self.account.id})
否则{
self.presentationMode.wrappedValue.discouse()文件
返回
}
self.item=项目
self.account=帐户