如何解决NavigationView的子视图在变量改变时自动返回父视图
我正在学习 Apple SwiftUI 教程,但遇到了一个问题:每当子视图更改 @EnvironmentObject 中的变量时,它们都会自动返回到父视图。
父 LandmarkList 视图功能允许导航到地标列表中的任何子视图,并且能够仅过滤用户“收藏夹”的那些子视图。
struct ContentView: View {
@EnvironmentObject var modelData: ModelData
@State private var showFavoritesOnly = true
var filteredLandmarks: [Landmark] {
modelData.landmarks.filter { landmark in
(!showFavoritesOnly || landmark.isFavorite)
}
}
var body: some View {
NavigationView {
List{
Toggle(isOn: $showFavoritesOnly) {
Text("Favorites only")
}
ForEach(filteredLandmarks) { landmark in
NavigationLink(destination: LandmarkDetail(landmark: landmark)) {
LandmarkRow(landmark: landmark)
}
}
}
.navigationBarTitle("Landmarks")
}
}
}
final class ModelData: ObservableObject {
@Published var landmarks: [Landmark] = load("/landmarkData.json")
}
在子视图中(并且仅当在父 LandmarkList 视图中将“仅收藏夹”切换为 ON 时),如果用户通过“收藏夹”更改“收藏夹”状态,则视图会立即返回到父视图。更令人困惑的是,除了最后一行中的地标之外,父 LandmarkList 中的每个子视图都会发生这种情况(允许在不显示此行为的情况下打开和关闭“收藏夹”状态)。
struct LandmarkDetail: View {
@EnvironmentObject var modelData: ModelData
var landmark: Landmark
var landmarkIndex: Int {
modelData.landmarks.firstIndex(where: { $0.id == landmark.id })!
}
var body: some View {
ScrollView {
vstack(alignment: .leading) {
Text(landmark.name)
.font(.title)
.foregroundColor(.primary)
FavoriteButton(isSet: $modelData.landmarks[landmarkIndex].isFavorite)
}
.navigationBarTitle(landmark.name)
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。