SwiftUI - невозможно представить полноэкранный режим с навигационной ссылкой в ​​iOS 16

Я пытаюсь перемещаться и/или отображать полноэкранный режим с помощью NavigationLink, и это зависит от условий. Когда я пытаюсь это сделать, я получаю ошибку компиляции какType '() -> ()' cannot conform to 'View'. Есть ли способ добиться этого?

Примечание. Я пытался скрытьNavigationBarдля меня . чтобы я мог просто видеть содержимое. Поскольку я делаю это из HostingViewController, я могу видетьHostingViewControllerпанель навигации для моегоErrorViewтакже. Вот почему я пытаюсь.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
        }
    }

}

2 ответа

Это уберет сообщение об ошибке.

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

Проблема в том, чтоisSelected.toggle()не является представлением и поэтому не может использоваться в аргументе назначения. Вы не должны пытаться выполнить код, который изменяет переменные в функциях построения представлений.

Кроме того, когда вы нажимаете на NavigationLink, будет представлен его пункт назначения. Так как старыйisActiveNavigationLink устарел, я не думаю, что вы можете предотвратить представление пункта назначения. Возможно, нажав нулевое значение, но я этого не пробовал.

Поэтому в моем предложенном решении вместо 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)")
                    }
                }
        }
    }
}
Другие вопросы по тегам