SwiftUI - TabView/NavigationLink 使用自定义绑定时导航中断
SwiftUI - TabView/NavigationLink navigation breaks when using a custom binding
我遇到了问题,我认为可能是错误,但很可能是我做错了什么。
我的模型中有一个 稍微 复杂的导航状态变量,当在 iPad.这一切都很好,除了在选项卡模式下,一旦我使用导航 link 一旦我似乎无法再次使用它,无论绑定是在我的选项卡视图上还是在列表中的导航 links 上。
非常感谢对此的任何想法,
干杯!
例子
NavigationItem.swift
enum SubNavigationItem: Hashable {
case overview, user, hobby
}
enum NavigationItem: Hashable {
case home(SubNavigationItem)
case settings
}
Model.swift
final class Model: ObservableObject {
@Published var selectedTab: NavigationItem = .home(.overview)
}
SwiftUIApp.swift
@main
struct SwiftUIApp: App {
@StateObject var model = Model()
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(model)
}
}
}
ContentView.swift
struct ContentView: View {
var body: some View {
AppTabNavigation()
}
}
AppTabNavigation.swift
struct AppTabNavigation: View {
@EnvironmentObject private var model: Model
var body: some View {
TabView(selection: $model.selectedTab) {
NavigationView {
HomeView()
}
.tabItem {
Label("Home", systemImage: "house")
}
.tag(NavigationItem.home(.overview))
NavigationView {
Text("Settings View")
}
.tabItem {
Label("Settings", systemImage: "gear")
}
.tag(NavigationItem.settings)
}
}
}
HomeView.swift
我在这里创建了一个绑定,因为选择需要一个可选的 而不是
struct HomeView: View {
@EnvironmentObject private var model: Model
var body: some View {
let binding = Binding<NavigationItem?>(
get: {
model.selectedTab
},
set: {
guard let item = [=16=] else { return }
model.selectedTab = item
}
)
List {
NavigationLink(
destination: Text("Users"),
tag: .home(.user),
selection: binding
) {
Text("Users")
}
NavigationLink(
destination: Text("Hobbies"),
tag: .home(.hobby),
selection: binding
) {
Text("Hobbies")
}
}
.navigationTitle("Home")
}
}
第二次尝试
我尝试按照@Lorem Ipsum 的建议将 selectedTab
属性 设为可选。这意味着我可以在那里删除绑定。但是 TabView 不适用于 属性。所以我为此创建了一个绑定并遇到了同样的问题但是有标签栏!
将所选选项卡设为可选
@Published var selectedTab: NavigationItem? = .home(.overview)
并摆脱那个临时绑定变量。只需使用变量
$model.selectedTab
如果变量永远不能为 nil,那么总是选择带有该临时变量的 IAW,它将只保留最后一个值。
我遇到了问题,我认为可能是错误,但很可能是我做错了什么。
我的模型中有一个 稍微 复杂的导航状态变量,当在 iPad.这一切都很好,除了在选项卡模式下,一旦我使用导航 link 一旦我似乎无法再次使用它,无论绑定是在我的选项卡视图上还是在列表中的导航 links 上。
非常感谢对此的任何想法, 干杯!
例子
NavigationItem.swift
enum SubNavigationItem: Hashable {
case overview, user, hobby
}
enum NavigationItem: Hashable {
case home(SubNavigationItem)
case settings
}
Model.swift
final class Model: ObservableObject {
@Published var selectedTab: NavigationItem = .home(.overview)
}
SwiftUIApp.swift
@main
struct SwiftUIApp: App {
@StateObject var model = Model()
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(model)
}
}
}
ContentView.swift
struct ContentView: View {
var body: some View {
AppTabNavigation()
}
}
AppTabNavigation.swift
struct AppTabNavigation: View {
@EnvironmentObject private var model: Model
var body: some View {
TabView(selection: $model.selectedTab) {
NavigationView {
HomeView()
}
.tabItem {
Label("Home", systemImage: "house")
}
.tag(NavigationItem.home(.overview))
NavigationView {
Text("Settings View")
}
.tabItem {
Label("Settings", systemImage: "gear")
}
.tag(NavigationItem.settings)
}
}
}
HomeView.swift
我在这里创建了一个绑定,因为选择需要一个可选的
struct HomeView: View {
@EnvironmentObject private var model: Model
var body: some View {
let binding = Binding<NavigationItem?>(
get: {
model.selectedTab
},
set: {
guard let item = [=16=] else { return }
model.selectedTab = item
}
)
List {
NavigationLink(
destination: Text("Users"),
tag: .home(.user),
selection: binding
) {
Text("Users")
}
NavigationLink(
destination: Text("Hobbies"),
tag: .home(.hobby),
selection: binding
) {
Text("Hobbies")
}
}
.navigationTitle("Home")
}
}
第二次尝试
我尝试按照@Lorem Ipsum 的建议将 selectedTab
属性 设为可选。这意味着我可以在那里删除绑定。但是 TabView 不适用于 属性。所以我为此创建了一个绑定并遇到了同样的问题但是有标签栏!
将所选选项卡设为可选
@Published var selectedTab: NavigationItem? = .home(.overview)
并摆脱那个临时绑定变量。只需使用变量
$model.selectedTab
如果变量永远不能为 nil,那么总是选择带有该临时变量的 IAW,它将只保留最后一个值。