【问题标题】:SwiftUI NavigationLink not pushing view programmaticallySwiftUI NavigationLink 未以编程方式推送视图
【发布时间】:2020-06-30 20:28:23
【问题描述】:

我在使用 NavigationLink 在 SwiftUI 中推送视图时遇到问题。

目前我已将其设置为绑定布尔值设置为“true”,具体取决于登录是否成功。但是,当我运行代码时,尽管布尔值已成功更改,但视图并未推送。

我正在使用 Swift 5 并在 WatchOS 6.2 上进行开发,它不需要将 NavigationLink 嵌套在 NavigationView 中,因为它不受支持。

import SwiftUI

struct Login: View {
    @State var pushErrorView = false
    @State var pushActivityView = false

    var body: some View {
        VStack{
            Button(action:
            {
                self.login()
            }) {
                Text("Log In")
            }
            
            NavigationLink(destination: PopupMessage(message: "Login Error"), isActive: self.$pushErrorView) {
                EmptyView()
            }.hidden()
            
            NavigationLink(destination: ActivityView(), isActive: self.$pushActivityView) {
              EmptyView()
            }.hidden()
        }
    }
    
    private func login(){         
        if loginSuccess() {
             self.pushActivityView = true                    
        }
        else {
             self.pushErrorView = true
        }
    }
}

【问题讨论】:

  • 您的 NavigationLinks 不需要 .hidden()。如果它们只有 EmptyView() 作为主体,它们将不可见。

标签: swift swiftui watchos watchos-6


【解决方案1】:

这是可行的解决方案。在复制代码上使用 Xcode 11.4 / watchOS 6.2 进行测试(由于缺少依赖组件)。

struct Login: View {
    @State var pushErrorView = false
    @State var pushNextView = false

    var body: some View {
        VStack{
            Button(action:
            {
                self.login()
            }) {
                Text("Log In")
            }.background(
                NavigationLink(destination: Group {
                    if pushErrorView { PopupMessage(message: "Login Error") }
                    else { ActivityView() }
                }, isActive: self.$pushNextView) { EmptyView() }
            )
        }
    }

    private func login(){
         self.pushErrorView = !loginSuccess()
         self.pushNextView = true
    }
}

【讨论】:

    【解决方案2】:

    尝试:

    NavigationLink(destination: YourSecondView(), isActive: $areYouGoingToSecondView) { 
        EmptyView() 
    }
    

    不需要.hidden()

    【讨论】:

    • 删除 .hidden() 仍然会产生相同的结果
    猜你喜欢
    • 2019-12-10
    • 2022-08-11
    • 2020-01-16
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多