微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

NavigationView的子视图在变量改变时自动返回父视图

如何解决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 举报,一经查实,本站将立刻删除。