NavigationLink将数组中的错误记录传递给另一个视图

时间:2020-10-11 14:03:51

标签: swift swiftui swiftui-navigationlink

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

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

不知道发生了什么,虽然这可能是因为每个记录的ID从1开始,但我将其更改为0,却没有用。

ps。我不知道代码块的格式是什么

1 个答案:

答案 0 :(得分:0)

Ah ..使用ForEach的原因是,因为您通过一种状态激活了容器中的所有链接,所以必须使用不同的链接构造函数使它们对于每行/单元格唯一,如下所示(可能还需要将您的bookDetail类型(我假设是Book才能适用于Hashable)

@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")
            }
        }
    }