我想使用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)
}
}
一些帮助将不胜感激:)
关于从导航栏进行导航...尝试以下方法(但在实际设备上,由于已知的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")
}
}
}