如何使用 SwiftUI 在 NavigationView 中正确包含 "Add Item" 按钮?
How to properly include "Add Item" button in a NavigationView using SwiftUI?
我需要在 NavigationView
的 List
.navigationBarItems
中添加一个 "Plus" ⊕ 按钮(在导航栏右侧),我想在其中添加一个行到列表,使用导航层次结构中的后续视图输入其名称等。
但首先,我什至无法正确导航按钮!当我在预览 Canvas 中点击它时,按钮的操作似乎有效。然而在一个实际的应用程序中,虽然它确实导航到我的目标视图,但当我点击该视图的“<返回”按钮时,应用程序崩溃并显示:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Tried to pop to a view controller that doesn't exist.'
有什么建议可以修复以下代码吗?这个任务太常见了,肯定是我漏掉了什么,做错了。
import SwiftUI
struct ListItem: Identifiable {
var id = UUID()
var name: String
}
struct ContentView: View {
var listItems = [
ListItem(name: "List Item One"),
ListItem(name: "List Item Two")
]
var body: some View {
NavigationView {
List(listItems) { listItem in
NavigationLink(destination: DetailView(existingItem: listItem)) {
Text(listItem.name)
}
}
.navigationBarTitle(Text("Configure List Items"), displayMode: .inline)
.navigationBarItems(trailing:
NavigationLink(destination: DetailView(existingItem: nil)) {
Image(systemName: "plus")
.resizable()
.padding(6)
.frame(width: 24, height: 24)
.background(Color.blue)
.clipShape(Circle())
.foregroundColor(.white)
} )
}
}
}
struct DetailView: View {
var existingItem: ListItem?
var body: some View {
Text((existingItem != nil) ? "Edit existing: \(existingItem!.name)" : "Enter NEW List Item")
}
}
谢谢!顺便说一下,我在 macOS Catalina 10.15.2 上使用:Xcode 11.3.1
NavigationLink
应该在 NavigationView
内,而不是在导航栏中,所以下面的方法有效...
@State private var addMode = false
var body: some View {
NavigationView {
VStack {
List(listItems) { listItem in
NavigationLink(destination: AddDetailView(existingItem: listItem)) {
Text(listItem.name)
}
}
.navigationBarTitle(Text("Configure List Items"), displayMode: .inline)
.navigationBarItems(trailing: Button(action: {
// button activates link
self.addMode = true
} ) {
Image(systemName: "plus")
.resizable()
.padding(6)
.frame(width: 24, height: 24)
.background(Color.blue)
.clipShape(Circle())
.foregroundColor(.white)
} )
// invisible link inside NavigationView for add mode
NavigationLink(destination: AddDetailView(existingItem: nil),
isActive: $addMode) { EmptyView() }
}
}
}
我需要在 NavigationView
的 List
.navigationBarItems
中添加一个 "Plus" ⊕ 按钮(在导航栏右侧),我想在其中添加一个行到列表,使用导航层次结构中的后续视图输入其名称等。
但首先,我什至无法正确导航按钮!当我在预览 Canvas 中点击它时,按钮的操作似乎有效。然而在一个实际的应用程序中,虽然它确实导航到我的目标视图,但当我点击该视图的“<返回”按钮时,应用程序崩溃并显示:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Tried to pop to a view controller that doesn't exist.'
有什么建议可以修复以下代码吗?这个任务太常见了,肯定是我漏掉了什么,做错了。
import SwiftUI
struct ListItem: Identifiable {
var id = UUID()
var name: String
}
struct ContentView: View {
var listItems = [
ListItem(name: "List Item One"),
ListItem(name: "List Item Two")
]
var body: some View {
NavigationView {
List(listItems) { listItem in
NavigationLink(destination: DetailView(existingItem: listItem)) {
Text(listItem.name)
}
}
.navigationBarTitle(Text("Configure List Items"), displayMode: .inline)
.navigationBarItems(trailing:
NavigationLink(destination: DetailView(existingItem: nil)) {
Image(systemName: "plus")
.resizable()
.padding(6)
.frame(width: 24, height: 24)
.background(Color.blue)
.clipShape(Circle())
.foregroundColor(.white)
} )
}
}
}
struct DetailView: View {
var existingItem: ListItem?
var body: some View {
Text((existingItem != nil) ? "Edit existing: \(existingItem!.name)" : "Enter NEW List Item")
}
}
谢谢!顺便说一下,我在 macOS Catalina 10.15.2 上使用:Xcode 11.3.1
NavigationLink
应该在 NavigationView
内,而不是在导航栏中,所以下面的方法有效...
@State private var addMode = false
var body: some View {
NavigationView {
VStack {
List(listItems) { listItem in
NavigationLink(destination: AddDetailView(existingItem: listItem)) {
Text(listItem.name)
}
}
.navigationBarTitle(Text("Configure List Items"), displayMode: .inline)
.navigationBarItems(trailing: Button(action: {
// button activates link
self.addMode = true
} ) {
Image(systemName: "plus")
.resizable()
.padding(6)
.frame(width: 24, height: 24)
.background(Color.blue)
.clipShape(Circle())
.foregroundColor(.white)
} )
// invisible link inside NavigationView for add mode
NavigationLink(destination: AddDetailView(existingItem: nil),
isActive: $addMode) { EmptyView() }
}
}
}