首页 > 解决方案 > 在 SwiftUI 中切换键盘类型

问题描述

我有一个文本字段来输入搜索词,还有一个分段控件来指示应该搜索哪个数据库表:

struct ContentView: View {
    enum SearchMode: Int {
        case searchInNumbers, searchInAlphabet
    }
    @State private var mode = SearchMode.searchInNumbers
    @State private var searchString = ""
    private var keyboardType: UIKeyboardType {
        if self.mode == .searchInNumbers {
            NSLog("Setting keyboard to numbersAndPunctuation")
            return .numbersAndPunctuation
        } else {
            NSLog("Setting keyboard to default")
            return .default
        }
    }
    
    var body: some View {
        VStack {
            TextField("Search string", text: self.$searchString)
                .keyboardType(self.keyboardType)
                .textFieldStyle(RoundedBorderTextFieldStyle())
            Picker("Search in", selection: self.makePickerBinding()) {
                Text("numbers").tag(0)
                Text("alphabet").tag(1)
            }.pickerStyle(SegmentedPickerStyle())
        }.padding(20)
    }
        
    private func makePickerBinding() -> Binding<Int> {
        Binding<Int>(
            get: {
                return self.mode.rawValue
            },
            set: { tag in
                self.mode = SearchMode.init(rawValue: tag)!
            }
        )
    }
}

键盘样式应该是我们搜索的数据库表的正确样式。这有效,除非键盘已经启动。

这意味着,当用户首先点击文本字段,然后更改分段控件时,键盘类型不会更改。

我不想用另一个包装的 UITextField 来修复它。它可以在 SwiftUI 中修复吗?

标签: swiftui

解决方案


推荐阅读