iPad侧边栏显示时选中特定Tab致SplitView崩溃求助
iOS 18 侧边栏适配TabView与SplitView崩溃及状态异常问题
环境信息
- 最低部署版本:iOS 18
- 模拟器版本:18.2
- Swift版本:16.2
场景说明
当前使用iOS 18新增的TabView组件,通过TabSection对Tab进行分组管理,应用主要面向iPad部署,必须保留SplitView多应用分屏功能(已在info.plist中将"Requires Full Screen"设为NO)。
因实际应用包含14个Tab,未分组的独立Tab存在数量限制,因此必须保留TabSection分组结构。移除分组后所有问题消失,但无法满足业务需求。
具体问题
崩溃问题:iPad横屏且显示侧边栏(标准布局)时,选中"Location Brief"或"Restricted Area Brief" Tab会导致应用崩溃,报错信息如下:
SwiftUI/SidebarAdaptableTabViewStyle_iOS.swift:482: Fatal error: Tried to update with invalid selection value若隐藏侧边栏(仅显示顶部菜单),所有Tab均可正常使用SplitView。
侧边栏选中状态粘连:在侧边栏中先选中"Location Brief",再切换到"Area Brief",内容视图正常切换,但侧边栏的选中高亮状态仍停留在"Location Brief"上。
Tab自动切换问题:SplitView中激活"NOTAM" Tab,当分屏比例为50/50或更大时,将视图缩小至该比例以下,会自动切换到"Area Brief" Tab。
复现代码
App入口代码
import SwiftUI @main struct scrapAppApp: App { var body: some Scene { WindowGroup { MenuView() } } }
MenuView代码
import SwiftUI struct MenuView: View { @AppStorage("MyAppTabViewCustomization") private var customization: TabViewCustomization @State private var selectedTab: Tabs? enum Tabs: String, Hashable, CaseIterable { case planner, plan, weather, locationbrief, areabrief, additional, notam, restrictedBrief, appSettings, settings var customizationID: String { rawValue } } var body: some View { TabView(selection: $selectedTab) { TabSection("Planner") { Tab("Plan", systemImage: "paperplane", value: Tabs.plan) { Text("Plan") }.customizationID(Tabs.plan.customizationID) }.customizationID(Tabs.planner.customizationID) TabSection("Weather") { Tab("Location Brief", systemImage: "mappin.square", value: Tabs.locationbrief) { Text("Location Brief") // 此处会崩溃 }.customizationID(Tabs.locationbrief.customizationID) Tab("Area Brief", systemImage: "map", value: .areabrief) { Text("Area Brief") }.customizationID(Tabs.areabrief.customizationID) }.customizationID(Tabs.weather.customizationID) TabSection("Additional") { Tab("NOTAM", systemImage: "text.document", value: Tabs.notam) { Text("NOTAM") }.customizationID(Tabs.notam.customizationID) Tab("Restricted Area Brief", systemImage: "xmark.seal", value: .restrictedBrief) { Text("Restricted Area Brief") // 此处会崩溃 }.customizationID(Tabs.restrictedBrief.customizationID) }.customizationID(Tabs.additional.customizationID) TabSection("App Settings") { Tab("Settings", systemImage: "gear", value: Tabs.settings) { Text("Settings") }.customizationID(Tabs.settings.customizationID) }.customizationID(Tabs.appSettings.customizationID) } .tabViewStyle(.sidebarAdaptable) .tabViewCustomization($customization) } } #Preview { MenuView() }
内容的提问来源于stack exchange,提问作者PW1990
相关产品推荐
相关产品推荐

