带有@EnvironmentObject的导航栏项目

问题描述 投票:0回答:1

我想使用SwiftUI创建一个Settings视图。我主要以苹果公司提供的关于SwiftUI的官方示例来实现我的代码。设置视图应具有一个切换,以显示是否显示我的收藏夹项目。

目前,我具有地标列表和设置视图。

struct Landmark: Hashable, Codable, Identifiable {
    var id: Int
    var imageName: String
    var title: String
    var isFavorite: Bool
    var description: String

    enum CodingKeys: String, CodingKey {
        case id, imageName, title, description
    }
}
final class UserData: ObservableObject {
    @Published var showFavoriteOnly: Bool = false
    @Published var items: [Landmark] = landmarkData
    @Published var showProfile: Bool = false
}
struct ItemList: View {
    @EnvironmentObject var userData: UserData
    @State var trailing: Bool = false

    init() {
        UITableView.appearance().separatorStyle = .none
    }

    var body: some View {
        NavigationView {
            List {
                VStack {
                    CircleBadgeView(text: String(landmarkData.count), thickness: 2)
                    Text("Tutorials available")
                }.frame(minWidth:0, maxWidth: .infinity)

                ForEach(userData.items) { landmark in
                    if !self.userData.showFavoriteOnly || landmark.isFavorite {
                        ZStack {
                            Image(landmark.imageName)
                                .resizable()
                                .frame(minWidth: 0, maxWidth: .infinity)
                                .cornerRadius(10)
                                .overlay(ImageOverlay(text: landmark.title), alignment: .bottomTrailing)
                            Text(String(landmark.isFavorite))


                            NavigationLink(destination: TutorialDetailView(landmark: landmark)) {
                                EmptyView()
                            }.buttonStyle(PlainButtonStyle())
                        }
                    }
                }
            }.navigationBarTitle("Tutorials")
                .navigationBarItems(trailing: trailingItem())
        }
    }
}

extension ItemList {
    func trailingItem () -> some View {
        return HStack {

            if userData.showProfile {
                NavigationLink(destination: ProfileView()) {
                    Image(systemName: "person.circle")
                        .imageScale(.large)
                        .accessibility(label: Text("Profile"))
                }
            }

            NavigationLink(destination: SettingsView().environmentObject(userData)) {
                Image(systemName: "gear")
                    .imageScale(.large)
                    .accessibility(label: Text("Settings"))
            }
        }
    }
}

您可以看到,我的SettingsView可从我的NavigationView的navigationBarItems访问。我不知道这是不是问题,但是当我将Toggle放入ListView时,它可以按预期工作。但是现在当我触发切换以仅启用收藏夹时,我的应用程序立即崩溃。

我尝试从Show profile触发SettingsView切换,并且可以正常工作。

struct SettingsView: View {
    @EnvironmentObject var userData: UserData

    var body: some View {
        Form {
            Section(header: Text("General")) {
                Toggle(isOn: $userData.showProfile) {
                    Text("Show profile")
                }
                Toggle(isOn: $userData.showFavoriteOnly) {
                    Text("Favorites only")
                }
            }

            Section(header: Text("UI")) {
                Toggle(isOn: .constant(false)) {
                    Text("Dark mode")
                }

                NavigationLink(destination: Text("third")) {
                    Text("Third navigation")
                }
            }

        }.navigationBarTitle(Text("Settings"), displayMode: .inline)
    }
}

一些帮助将不胜感激:)

ios swift swiftui
1个回答
0
投票

关于从导航栏进行导航...尝试以下方法(但在实际设备上,由于已知的NavigationLink当前“一次导航”问题)

struct TestContentView: View {
    @State private var showSettings = false

    var body: some View {
        NavigationView {
            VStack {
                NavigationLink(destination: Text("SettingsView"), isActive: $showSettings) {
                    EmptyView()
                }

                List(0 ..< 30, id: \.self) { i in
                    Text("Row \(i)")
                }
                .navigationBarItems(trailing:
                    Button(action: {
                        self.showSettings = true
                    }) {
                        Image(systemName: "gear")
                    })
            }
            .navigationBarTitle("Main")
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.