SwiftUI, Предупреждение нарушает навигационную связь?

#swiftui #alert #swiftui-navigationlink

Вопрос:

в предыдущих потоках по этому вопросу были не быстрые ответы, которые я не могу понять, как реализовать в SwiftUI. Пожалуйста, обратите внимание, что я использую Xcode 12.5.

Я создал игровую площадку в попытке опубликовать «демонстрационную» версию кода, но разве вы не знаете, что игровая площадка работает безупречно. Итак, я собираюсь опубликовать небольшие фрагменты кода, не заставляя ваши глаза кровоточить. Я получаю это предупреждение:

pushViewController:анимированный: вызывается <TtGC7SwiftUI41StyleContextSplitViewNavigationControllerVS_19SidebarStyleContext 0x103021c00> во время существующего перехода или представления; стек навигации не будет обновляться>.

Вот как работает код:

Перейдите от представления A к представлению B. В навигационной ссылке View A я запускаю это:

             NavigationLink(destination: MainScreen(user: user)) {
                CapsuleButtonView(txt: "LOGIN")
            }.simultaneousGesture(TapGesture().onEnded {
                user.login()
            })
            .padding([.leading, .bottom, .trailing])
 

user.login() проверяет, введены ли имя пользователя и пароль (привязки). Если нет, он переворачивает @Published Bool, который представление, выполняющее приведенный выше код, использует для запуска предупреждающего сообщения:

 .alert(isPresented: $user.alert, content: {
    Alert(title: Text("Message"), message: Text(user.alertMsg), dismissButton: .destructive(Text("Ok")))
})
 

Предупреждение появляется, как и должно быть, но я думаю, что оно появляется после того, как навигационная ссылка начала переходить от представления A к представлению B. Таким образом, после появления предупреждения блок одновременной настройки навигационной ссылки все еще запускает код в нем (я проверил с помощью инструкции print), но НЕ переходит к представлению B.

Спасибо за вашу помощь, ребята. После 3 дней такого поиска я собираюсь вырвать те немногие волосы, которые у меня остались.

Комментарии:

1. Запустил свою процедуру внутри кнопки, а не с помощью кнопки в навигационной ссылке. Затем использовал логический вывод из вышеупомянутого маршрута, чтобы перейти к следующему представлению. Навигационная ссылка(пункт назначения: View2(), активна: $navigate) { Пустой просмотр() }.