Как правильно включить кнопку «Добавить элемент» в NavigationView с помощью SwiftUI? - PullRequest
2 голосов
/ 16 января 2020

Мне нужна кнопка «Плюс» in в моих NavigationView х List .navigationBarItems (прямо на панели навигации), которую я хотел бы добавить в список, используя последующее представление в иерархия навигации для ввода его имени и т. д. c.

enter image description here

Но, во-первых, я даже не могу получить кнопку для правильной навигации! Когда я нажимаю на него в Preview Canvas, кажется, что кнопка работает. И все же в реальном приложении, хотя оно и переходит к моему целевому представлению, когда я нажимаю кнопку «<Назад» в этом представлении, происходит сбой приложения с: </p>

Завершение приложения из-за необработанного исключения «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

1 Ответ

3 голосов
/ 16 января 2020

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