我有一个结构列表。轻按按钮将调用结构上的变异函数,然后进行导航。
但是导航不会触发。如果删除了对变异函数self.logins[index].updateLastLogin()
的调用,它将重新开始工作。为什么?
要进行复制,请将以下内容粘贴到一个空的SwiftUI项目中:
struct Login: Identifiable, Hashable {
let id = UUID()
let name: String
var lastLogin: Date?
mutating func updateLastLogin() {
self.lastLogin = Date()
}
}
struct ContentView: View {
@State private var logins = ["Zaphod", "Arthur", "Ford", "Marvin", "Trillian"].map { Login(name: $0) }
@State private var selection: Login?
var body: some View {
NavigationView {
List {
ForEach(self.logins) { login in
VStack {
NavigationLink(destination: Text(login.name).font(.largeTitle),
tag: login,
selection: self.$selection) {
EmptyView()
}
Button(action: {
self.navigate(login: login)
}, label: {
Text(login.name)
})
}
}
}
}
}
func navigate(login: Login) {
guard let index = self.logins.firstIndex(of: login) else {
fatalError()
}
self.logins[index].updateLastLogin() // remove this line
self.selection = login
}
}
答案 0 :(得分:1)
这里是工作方法的演示。经过Xcode 12 / iOS 14的测试
struct DemoView: View {
@State private var logins = ["Zaphod", "Arthur", "Ford", "Marvin", "Trillian"].map { Login(name: $0) }
@State private var selection: UUID?
var body: some View {
NavigationView {
List {
ForEach(self.logins) { login in
VStack {
NavigationLink(destination: Text(login.name).font(.largeTitle),
tag: login.id,
selection: self.$selection) {
EmptyView()
}
Button(action: {
self.navigate(login: login)
}, label: {
Text(login.name)
})
}
}
}
}
}
func navigate(login: Login) {
guard let index = self.logins.firstIndex(of: login) else {
fatalError()
}
self.logins[index].updateLastLogin() // remove this line
self.selection = login.id
}
}