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

iOS 18.1自定义TextField键盘工具栏在第二个Tab不显示求助

解决TabView中第二个Tab自定义输入框工具栏不显示的问题

针对iOS 18.1里TabView第二个Tab中自定义数字输入框工具栏不显示的问题,无需依赖NavigationView,可通过以下几种方式解决:

1. 显式绑定焦点状态并关联键盘工具栏

自定义MyField时,用@FocusState显式管理输入框的焦点,确保工具栏和键盘强绑定:

struct MyField: View {
    @Binding var value: String
    @FocusState var isFocused: Bool
    
    var body: some View {
        TextField("输入数字", text: $value)
            .keyboardType(.decimalPad)
            .focused($isFocused)
            .toolbar {
                ToolbarItemGroup(placement: .keyboard) {
                    HStack {
                        Button("清除") { value = "" }
                        Spacer()
                        Button("完成") { isFocused = false }
                    }
                }
            }
    }
}

2. 为每个Tab的输入框分配独立焦点状态

TabView的子视图状态可能因共享导致冲突,在父视图中为每个Tab的MyField单独维护焦点变量:

struct ParentView: View {
    @State private var selectedTab = 0
    @State private var tab1Value = ""
    @State private var tab2Value = ""
    @FocusState private var tab1Focused: Bool
    @FocusState private var tab2Focused: Bool
    
    var body: some View {
        TabView(selection: $selectedTab) {
            MyField(value: $tab1Value)
                .focused($tab1Focused)
                .tabItem { Label("Tab 1", systemImage: "1.circle") }
                .tag(0)
            
            MyField(value: $tab2Value)
                .focused($tab2Focused)
                .tabItem { Label("Tab 2", systemImage: "2.circle") }
                .tag(1)
        }
    }
}

3. Tab切换时手动刷新状态

监听Tab切换事件,强制重置焦点状态,触发工具栏重新加载:

struct ParentView: View {
    @State private var selectedTab = 0
    @State private var tab1Value = ""
    @State private var tab2Value = ""
    @FocusState private var currentFocused: TabFocus?
    
    enum TabFocus { case tab1, tab2 }
    
    var body: some View {
        TabView(selection: $selectedTab) {
            MyField(value: $tab1Value)
                .focused($currentFocused, equals: .tab1)
                .tabItem { Label("Tab 1", systemImage: "1.circle") }
                .tag(0)
            
            MyField(value: $tab2Value)
                .focused($currentFocused, equals: .tab2)
                .tabItem { Label("Tab 2", systemImage: "2.circle") }
                .tag(1)
        }
        .onChange(of: selectedTab) { _ in
            currentFocused = nil
        }
    }
}

关键注意事项

  • 必须使用ToolbarItemGroup(placement: .keyboard)明确将工具栏绑定到键盘,避免依赖NavigationView的环境上下文
  • iOS 18.1中TabView的视图生命周期有细微调整,显式管理焦点能规避系统自动状态管理的bug
  • 测试时需验证:每个Tab的输入框获得焦点时工具栏弹出,切换Tab后重新聚焦仍能正常显示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 23:27:32