You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

macOS端SwiftUI切换Tab时崩溃的Bug排查求助

macOS 15.0下TabView切换崩溃:重复工具栏项错误

我喜欢macOS和iPad上的TabView控件,于是在跨平台应用里尝试使用它,但发现macOS端每次切换Tab都会崩溃,报错信息如下:

Thread 1: "NSToolbar 0x600003de33c0 already contains an item with the identifier com.apple.SwiftUI.navigationSplitView.toggleSidebar. Duplicate items of this type are not allowed."

升级到macOS 15.0后,不少开发者都遇到了类似问题(涉及工具栏、搜索框等场景)。我注释了大部分代码仍无法解决,因此创建了最小可复现项目,代码如下:

import SwiftUI
import SwiftData


@Model
class Issue {
    var name: String

    init(name: String) {
        self.name = name
    }
}

@main
struct TestMultiplatformApp: App {
    var sharedModelContainer: ModelContainer = {
        let schema = Schema([
            Issue.self,
        ])
        let modelConfiguration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: false)

        do {
            return try ModelContainer(for: schema, configurations: [modelConfiguration])
        } catch {
            fatalError("Could not create ModelContainer: \(error)")
        }
    }()

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .modelContainer(sharedModelContainer)
    }
}


struct ContentView: View {
    @State var isCompact: Bool = true

    var body: some View {
        VStack {
            if isCompact {
                EntryTab()
            }  else {
                EntrySidebar()
            }
            Toggle(isOn: $isCompact, label: {
                Text(isCompact ? "TabView" : "Sidebar")
            })
            .padding(.horizontal, 20)
            .padding(.bottom, 20)
        }
    }
}

public struct tabControl: Identifiable, Hashable, Sendable {
    public static func == (lhs: tabControl, rhs: tabControl) -> Bool {
        lhs.id < rhs.id
    }
    
    public var id: Int // Tab Number
    public var displayName: String
    
    public init(id: Int, displayName: String) {
        self.id = id
        self.displayName = displayName
    }
}

struct EntryTab: View {
    let entryTabs = [
        tabControl(id: 0, displayName: "row 0"),
        tabControl(id: 1, displayName: "row 1"),
        tabControl(id: 2, displayName: "row 2"),
        tabControl(id: 3, displayName: "row 3")
    ]
    @State private var selectedTab: Int = 0
    
    var body: some View {
        TabView(selection: $selectedTab) {
            ForEach(entryTabs) { tabCtrl in
                NavigationSplitView {
                    Text("Selected tab is \(selectedTab)")
                } detail: {
                    Text("Choose item from sidebar... in future this would be content")
                }
                .tabItem {
                    Text(tabCtrl.displayName)
                }
                .tag(tabCtrl.id)
            }
        }
    }
}

struct EntrySidebar: View {
    @State private var selectedTabID: Int?
    let entryTabs = [
        tabControl(id: 0, displayName: "row 0"),
        tabControl(id: 1, displayName: "row 1"),
        tabControl(id: 2, displayName: "row 2"),
        tabControl(id: 3, displayName: "row 3")
    ]
    
    var body: some View {
        NavigationSplitView(sidebar: {
            List(entryTabs, id:\.id, selection: $selectedTabID) { thisItem in
                Text(thisItem.displayName)
            }
        }, content: {
            Text("Hi selected tab: \(String(describing: selectedTabID))")
        }, detail: {
            Text("Choose item from sidebar... in future this would be content")
        })
        .onAppear() {
            // Set the selected tab
            selectedTabID = 1
        }
    }
}

内容的提问来源于stack exchange,提问作者Kyra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 15:36:04