SwiftUI macOS应用切换列表项时重置State的方法问询
解决SwiftUI中切换List行时重置绑定状态的问题
嘿,这个问题我之前也遇到过——SwiftUI的onAppear在这种条件渲染的场景下确实不太靠谱,因为只要selectedPerson没有变成nil,PersonDetail视图其实不会被销毁重建,所以只会触发一次onAppear。不过有几个简单的方法能解决这个问题:
方法1:在父视图中监听selectedPerson的变化
直接在PersonDetail视图上添加.onChange修饰符,监听selectedPerson的更新,一旦变化就重置s_selectedView:
NavigationView { PersonList(selectedPerson: $selectedPerson) if let selectedPerson = selectedPerson { PersonDetail(person: selectedPerson, s_currentView: self.$s_selectedView) .onChange(of: selectedPerson) { _ in // 每次选中新的Person时重置状态 self.s_selectedView = 0 } } }
方法2:在PersonDetail内部监听person的变化
如果希望逻辑封装在详情视图内部,可以在PersonDetail里监听传入的person参数变化,然后重置绑定的状态:
struct PersonDetail: View { let person: Person @Binding var s_currentView: Int var body: some View { // 你的详情视图内容,比如展示Person属性 VStack { Text("姓名:\(person.name)") Text("年龄:\(person.age)") // 其他属性... } .onChange(of: person) { _ in // 当Person对象更新时重置视图状态 s_currentView = 0 } } }
为什么onAppear不生效?
这里的核心原因是:当你从Person A切换到Person B时,selectedPerson只是从一个非nil值变成另一个非nil值,SwiftUI会复用现有的PersonDetail视图,而不是销毁重建它。所以onAppear只会在视图第一次出现时触发,后续切换Person不会再次调用。而.onChange(of: person)会精准捕捉到person对象的变化,不管视图是否被复用。
内容的提问来源于stack exchange,提问作者davidev
相关产品推荐
相关产品推荐

