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, будет представлен его пункт назначения. Так как старыйisActive
NavigationLink устарел, я не думаю, что вы можете предотвратить представление пункта назначения. Возможно, нажав нулевое значение, но я этого не пробовал.
Поэтому в моем предложенном решении вместо 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)")
}
}
}
}
}