Swift NavigationLink正在将数组中的错误记录传递给另一个视图 ForEach(bookData){bookDetail in 按钮(操作:{ //页码更新 }) { BookView(书籍:bookDetail) } .foregroundColor(.primary) .背景( 导航链接(目的地:EditBook(书籍:bookDetail),isActive:$showEdit){ EmptyView() } ) .上下文菜单{ 按钮(操作:{ self.showEdit=true }) { 标签(“编辑”,系统图像:“铅笔”) } 按钮(操作:{ //删除操作 }) { 标签(“删除”,系统图像:“垃圾”) } } }

Swift NavigationLink正在将数组中的错误记录传递给另一个视图 ForEach(bookData){bookDetail in 按钮(操作:{ //页码更新 }) { BookView(书籍:bookDetail) } .foregroundColor(.primary) .背景( 导航链接(目的地:EditBook(书籍:bookDetail),isActive:$showEdit){ EmptyView() } ) .上下文菜单{ 按钮(操作:{ self.showEdit=true }) { 标签(“编辑”,系统图像:“铅笔”) } 按钮(操作:{ //删除操作 }) { 标签(“删除”,系统图像:“垃圾”) } } },swift,swiftui,swiftui-navigationlink,Swift,Swiftui,Swiftui Navigationlink,转到EditBook的navigationLink发送了错误的视图。在我的数组中,这是一个json文件,当我尝试发送第二条记录时,它似乎通过了第一条记录,因为EditBook视图显示了第一条记录的数据。更奇怪的是,第一条记录传递第三条记录的数据(只有3条记录) 我不知道发生了什么,我想可能是因为每条记录的id从1开始,但我把它改为零,它不起作用 另外,我不知道代码块的格式是什么。。使用ForEach您应该这样做,因为您通过一种状态激活容器中的所有链接,相反,您必须使用不同的链接构造函数使它们对于

转到EditBook的navigationLink发送了错误的视图。在我的数组中,这是一个json文件,当我尝试发送第二条记录时,它似乎通过了第一条记录,因为EditBook视图显示了第一条记录的数据。更奇怪的是,第一条记录传递第三条记录的数据(只有3条记录)

我不知道发生了什么,我想可能是因为每条记录的id从1开始,但我把它改为零,它不起作用


另外,我不知道代码块的格式是什么。。使用
ForEach
您应该这样做,因为您通过一种状态激活容器中的所有链接,相反,您必须使用不同的链接构造函数使它们对于每一行/单元格都是唯一的,如下所示(可能还需要将您的
bookDetail
类型(我假设它是
Book
)与Hashable一致)


为什么要使用NavigationLink作为按钮的背景?NavigationLink本身是一个按钮,因此您实际上嵌套了两个按钮。另外,它显示最后一项的原因是因为您在循环中使用它,闭包不捕获单个状态,而是捕获循环的最终状态。您应该将ForEach块中的所有代码移到它自己的视图中,以保持状态。@ClausJørgensen我最初将导航链接放在上下文菜单下,但它不起作用,因为它必须直接放在导航视图下。我真的想知道为什么它不起作用,我在这个网站上的最后一个问题就是关于这个。这个实现真的否定了上下文菜单的需要,所以我有更好的方法吗?@ClausJørgensen是的,我刚刚意识到发生了什么,按钮现在使用导航链接,但我只希望上下文菜单这样做,我应该如何修复它?啊,这很有意义,谢谢!不过有一个问题,你看背景修改器在一个按钮下,我想把点击手势保存到另一个视图中,我怎么能把这个导航链接只放在上下文菜单下呢。
@State private var selectedBook: Book? = nil

...

    ForEach(bookData){ bookDetail in
        Button(action: {
            //Page number update
        }) {
            BookView(book: bookDetail)
        }
        .foregroundColor(.primary)
        .background(
            NavigationLink(destination: EditBook(book: bookDetail), tag: bookDetail, selection: $selectedBook) {
               EmptyView()
           }
        )
        .contextMenu{
            Button(action: {
                self.selectedBook = bookDetail
            }) {
                Label("Edit", systemImage: "pencil")
            }
            Button(action: {
                //Delete action
            }) {
                Label("Delete", systemImage: "trash")
            }
        }
    }