【问题标题】:How to properly include "Add Item" button in a NavigationView using SwiftUI?如何使用 SwiftUI 在 NavigationView 中正确包含“添加项目”按钮?
【发布时间】:2020-05-03 16:18:01
【问题描述】:

我需要在我的NavigationViewList .navigationBarItems(在导航栏上)中有一个“加号”⊕ 按钮,我想在列表中添加一行,使用后续视图导航层次结构以输入其名称等。

但首先,我什至无法让按钮正确导航!当我在预览画布中点击它时,按钮的操作似乎有效。然而在一个实际的应用程序中,当它导航到我的目标视图时,当我点击该视图的“

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

请给我建议如何修复以下代码?这个任务太常见了,我肯定错过了什么并且做错了。

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

【问题讨论】:

    标签: ios swift xcode swiftui navigationview


    【解决方案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() }
            }
        }
    }
    

    【讨论】:

    • 没有内置组件吗?
    • @Alexander - 我想知道同样的事情!有 EditButton() 及其相关功能,还有一些其他 UI 元素可以使用“加号按钮”进行添加操作,但在这个 NavigationView 的情况下,它让我大吃一惊,我会在 2020 年必须滚动我自己的按钮(即使使用Image(systemName: 等)。
    • 感谢这个非常有用的hackaround!我正在学习 SwiftUI,对缺乏标准小部件感到有些震惊,但对 Apple 文档的低质量感到更加震惊。 FWIW 还有Image(systemName: "plus.circle") 如果你想要默认的圆圈添加图标,至少从 XCode 12 开始;用.font(.title) 等修改它非常简洁。
    猜你喜欢
    • 2022-01-22
    • 2021-10-03
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 2016-02-18
    • 2018-08-25
    • 2019-11-02
    相关资源
    最近更新 更多