SwiftUI -在iOS 16中无法全屏显示导航链接

but5z9lq  于 2023-01-08  发布在  Swift
关注(0)|答案(2)|浏览(326)

我尝试使用NavigationLink进行导航和/或全屏显示,但它会根据条件而有所不同。当我尝试这样做时,我收到Type '() -> ()' cannot conform to 'View'编译错误。有什么方法可以实现这一点吗?
注:我尝试隐藏ErrorViewNavigationBar,这样我就可以只看到内容。因为我是从HostingViewController中执行此操作的,所以我也可以看到ErrorViewHostingViewController导航栏。这就是我尝试.fullScreenCover方法的原因。

import SwiftUI

struct LoginView: View {
    @State private var isSelected: Bool = false
    @State private var isSuccess: Bool = false

    var nextButton: some View {
        HStack {
                NavigationLink("Test") {
                 if isSuccess {
                    HomeView(user: user)
                  } else {
                    isSelected.toggle()
                  }
                }
            .fullScreenCover(isPresented: $isSelected) {
                 ErrorView()
               }
            .buttonStyle(PlainButtonStyle())
            .font(.system(size: 24))
        }
    }

    var body: some View {
        NavigationStack {
            nextButton
        }
    }

}
0tdrvxhp

0tdrvxhp1#

这将删 debugging 误消息。

struct LoginView: View {
        @State var isSuccess: Bool = false
            
    var body: some View {
        NavigationStack {
            NavigationLink {
                HomeView()
            } label: {
                Text("Login")
            }
            .fullScreenCover(isPresented: .constant(!isSuccess), content: {
                    ErrorView()
            })
            .buttonStyle(PlainButtonStyle())
            .font(.system(size: 24))
        }
    }
}
acruukt9

acruukt92#

问题是isSelected.toggle()不是一个视图,因此不能在destination参数中使用,你不应该在视图构建函数中执行变量变异的代码。
另外,当你点击一个NavigationLink时,它的目的地将会显示出来。因为旧的isActive NavigationLink已经过时了,我不认为你可以阻止目的地的显示。也许可以通过推送一个nil值,但我还没有尝试过。
所以我提出的解决方案使用按钮而不是NavigationLink。如果isSuccess,它可以导航到您想要的视图,否则它会弹出错误全屏封面。
但是在NavigationStack中使用路径可能会变得非常复杂。

struct LoginView: View {
    struct UserInfo: Hashable {
        var name: String
        var email: String
    }
    
    enum Path: Hashable {
        case user(UserInfo)
    }
    
    @State private var isSelected: Bool = false
    @State private var isSuccess: Bool = true
    
    @State var path: [Path] = []
    
    var nextButton: some View {
        HStack {
            Button {
                if isSuccess {
                    path.append(Path.user(UserInfo(name: "Subbu", email: "")))
                } else {
                    isSelected = true
                }
            } label: {
                Text("Test")
            }
            .buttonStyle(.plain)
            .font(.system(size: 24))
        }
        .fullScreenCover(isPresented: $isSelected) {
            Text("ErrorView")
        }
    }
    
    var body: some View {
        NavigationStack(path: $path) {
            nextButton
                .navigationDestination(for: Path.self) { pathItem in
                    switch(pathItem) {
                    case .user(let userInfo):
                        Text("\(userInfo.name)")
                    }
                }
        }
    }
}

相关问题