swift NavigationLink .navigationDestination被调用多次并推送到新视图两次

vql8enpb  于 2023-01-04  发布在  Swift
关注(0)|答案(2)|浏览(184)

我有一个可搜索的列表,其中显示了保存在数组中的某个数据模型的各种示例。当点击其中一个列表行时,将打开一个新视图,显示有关该数据模型的一些信息。出于演示目的,打开的视图显示一个随机生成的数字。到目前为止,这与预期的一样。
但是,当执行显示多个项目的搜索,然后执行仅显示第一个项目的子集的第二个搜索时,在点击选定行后,NavigationLink将推到新视图两次。
这个问题很容易用很少的代码复制。下面是我的数据模型:

struct DataModel: Identifiable, Hashable {
let id = UUID()
var name: String

init(name: String = "unknown") {
    self.name = name
}

static func == (lhs: DataModel, rhs: DataModel) -> Bool {
    return lhs.id == rhs.id
}

func hash(into hasher: inout Hasher) {
    hasher.combine(id)
}
}

以下是我的观点:

var allDataModels = [DataModel]()

struct ContentView: View {
@State var searchDataModels = [DataModel]()
@State var searchText = ""

let numbers = Array(1...10)

var body: some View {
    NavigationStack {
        List {
            ForEach(searchDataModels, id: \.id) { model in
                NavigationLink(value: model, label: {
                    Text(model.name)
                })
            }
        }.searchable(text: $searchText)

            .onChange(of: searchText, perform: { _ in
                updateSearch()
            })
            
            .navigationDestination(for: DataModel.self, destination: { _ in
                Text("\(Int.random(in: 1...100))")})
    }.onAppear {
        for i in 0...9 {
            allDataModels.append(DataModel(name: "Data \(numbers[i])"))
        }
    }
}

func updateSearch() {
    searchDataModels = allDataModels.filter( { $0.name.localizedCaseInsensitiveContains(searchText) } )
}
}

以下视频演示了执行两次搜索后NavigationLink推送到两个视图的过程。如视频中所示,屏幕上的数字会发生变化,从而使视图之间易于区分。

此问题已在iOS 16 beta 3中测试并出现,在beta 4中仍然存在。早期版本未测试(iOS 16中的新功能是NavigationStack和.navigationDestination(for: , destination:))。

cotxawn7

cotxawn71#

这个问题似乎在iOS 16 beta 5中得到了解决。

j9per5c4

j9per5c42#

我在Xcode 14.2中遇到了同样的问题。我有一个NavigationStack,它的列表显示来自@FetchRequest的CoreData。奇怪的是,当我开始存储二进制数据时,它开始像这样运行。不确定这是否只是巧合。目前,我对我在以下位置找到的“变通方法”感到“高兴”:
https://developer.apple.com/forums/thread/711899?answerId=725008022#725008022
以下所有文本均复制自上述链接。
在堆栈或按钮上使用Form .buttonStyle(BorderlessButtonStyle())修复了问题。
我认为这个错误是由于在导航堆栈或窗体的某些情况下默认按钮的点击测试层问题。在我的窗体中,如果没有修改器,堆栈中的所有按钮都会被一起点击。修改器只是意外地修复了它。在运行时,你不会得到错误的正确根源。这确实是一个奇怪的Bug

相关问题