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

SwiftUI中ToolbarItemGroup在iPhone上无法显示及切换异常求助

解决方案

问题根源

直接通过if !hideToolbarItems隐藏整个ToolbarItemGroup会破坏SwiftUI对工具栏自适应布局的计算逻辑:

  • iPad上切换状态后,系统无法重新识别溢出菜单的归属;
  • iPhone上因为空的ToolbarItemGroup被SwiftUI优化移除,导致按钮完全不显示。

修复方案

保持ToolbarItemGroup始终存在,仅对组内的按钮单独做条件判断,同时确保NavigationSplitView的detail部分有内容(避免iPhone上布局异常):

@State var hideToolbarItems = false

var body: some View {
    NavigationSplitView {
        Text("Hello, World!")
            .navigationTitle("MyToolbarItems")
            .toolbar {
                ToolbarItemGroup(placement: .navigationBarTrailing) {
                    Button {
                        hideToolbarItems.toggle()
                    } label: {
                        Text("Toggle")
                    }
                    
                    // 仅对单个按钮做条件判断,保持ToolbarItemGroup存在
                    if !hideToolbarItems {
                        Button {
                        } label: {
                            Text("Button1")
                        }
                        Button {
                        } label: {
                            Text("Button2")
                        }
                        Button {
                        } label: {
                            Text("Button3")
                        }
                    }
                }
            }
    } detail: {
        // 给detail添加默认视图,避免iPhone上布局异常
        Text("Detail View")
            .navigationTitle("Detail")
    }
}

额外优化(可选)

如果需要将Toggle按钮与其他按钮分离,也可以保留单独的ToolbarItem,但确保ToolbarItemGroup不会变为空:

@State var hideToolbarItems = false

var body: some View {
    NavigationSplitView {
        Text("Hello, World!")
            .navigationTitle("MyToolbarItems")
            .toolbar {
                ToolbarItem(placement: .navigationBarTrailing) {
                    Button {
                        hideToolbarItems.toggle()
                    } label: {
                        Text("Toggle")
                    }
                }
                
                ToolbarItemGroup(placement: .navigationBarTrailing) {
                    if !hideToolbarItems {
                        Button("Button1") {}
                        Button("Button2") {}
                        Button("Button3") {}
                    } else {
                        // 添加空视图占位,保持ToolbarItemGroup的存在
                        EmptyView()
                    }
                }
            }
    } detail: {
        Text("Detail View")
            .navigationTitle("Detail")
    }
}

原理说明

SwiftUI的工具栏布局依赖于视图结构的稳定性,当ToolbarItemGroup被完全移除后,系统无法重新触发自适应布局逻辑。保持组的存在,仅动态修改内部元素,能让SwiftUI持续跟踪工具栏的内容变化,正确处理iPad的溢出菜单和iPhone的导航栏布局。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 19:45:30