gpt4 book ai didi

ios - SwiftUI Landmarks App 教程屏幕在切换收藏夹时导航返回

转载 作者:行者123 更新时间:2023-12-01 18:03:42 30 4
gpt4 key购买 nike

我正在关注这个 SwiftUI tutorial并下载了 project files .

我构建并运行了完整的项目,没有进行任何修改。在应用程序中,如果我:

  1. 在 ListView 中打开“仅显示收藏夹”
  2. 点击进入“Turtle Rock”或“Chilkoot Trail”详细 View
  3. 在详细 View 中,我切换收藏夹按钮(黄色星形图标)

屏幕会自动跳回 ListView 。

但如果我在 ListView 中点击最后一个项目(“圣玛丽湖”)的详细 View ,我可以打开和关闭黄色星号按钮并仍然停留在相同的详细 View 中。

谁能解释这种行为?我需要做什么才能留在详细信息 View 中而不会被迫导航回 ListView ?

最佳答案

好吧,实际上这是 SwiftUI 缺陷,不能刷新 View 层次结构之外的 View (即调用 body)——它应该在下次出现后立即更新。 (我提交了反馈 #FB7659875,并建议对每个受影响的人都这样做 - 当重复更好时就是这种情况)

同时,以下是可能的临时解决方法(但即使在 Apple 修复问题后它仍会继续工作,因此是安全的)。这个想法是使用本地 View 状态模型作为 View 和已发布属性之间的中间层,并使其仅在 View 可见时更新。

在提到的项目中仅提供了要替换的更正 View 。

使用 Xcode 11.4/iOS 13.4 测试 - 没有意外的“跳回”

demo

struct LandmarkList: View {
@EnvironmentObject private var userData: UserData

@State private var landmarks = [Landmark]() // local model
@State private var isVisible = false // own visibility state
var body: some View {
NavigationView {
List {
Toggle(isOn: $userData.showFavoritesOnly) {
Text("Show Favorites Only")
}

ForEach(landmarks) { landmark in
if !self.userData.showFavoritesOnly || landmark.isFavorite {
NavigationLink(
destination: LandmarkDetail(landmark: landmark)
.environmentObject(self.userData)
) {
LandmarkRow(landmark: landmark)
}
}
}
}
.onReceive(userData.$landmarks) { array in // observe external model
if self.isVisible {
self.landmarks = array // update local only if visible
}
}
.onAppear {
self.isVisible = true // track own state
self.landmarks = self.userData.landmarks
}
.onDisappear { self.isVisible = false } // track own state
.navigationBarTitle(Text("Landmarks"))
}
}
}

关于ios - SwiftUI Landmarks App 教程屏幕在切换收藏夹时导航返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61094219/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com