如何使用SwiftUI在NavigationView中正确包含“添加项目”按钮?

时间:2020-01-16 18:55:47

标签: ios swift xcode swiftui navigationview

我需要在NavigationView的{​​{1}} List(在导航栏的右边)上添加一个“加号”⊕按钮,我想在列表中添加一行,使用导航层次结构中的后续视图输入其名称,等等。

enter image description here

但是首先,我什至无法获得正确导航的按钮!当我在“预览画布”中点击它时,该按钮的操作似乎起作用。然而,在实际的应用程序中,虽然它确实导航到我的目标视图,但是当我点击该视图的“ <返回”按钮时,该应用程序崩溃并显示为:

由于未捕获的异常“ NSInternalInconsistencyException”而终止应用程序,原因:“试图弹出到不存在的视图控制器。”

请问我如何解决以下代码的任何建议?这项任务是如此普遍,肯定是我遗漏了某些东西并做错了。

.navigationBarItems

谢谢!顺便说一句,我在MacOS Catalina 10.15.2上使用:Xcode 11.3.1

1 个答案:

答案 0 :(得分:6)

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() }
        }
    }
}