使用自定义按钮扩展SwiftUI键盘


10

我正在尝试找到一种将键或按钮添加到SwiftUI数字键盘的方法。我发现的唯一参考资料说这是不可能的。在Swift世界中,我添加了一个带有按钮的工具栏,以关闭键盘或执行其他功能。

我什至会用顶部的按钮构建一个ZStack视图,但是我找不到将numberPad添加到我自己的视图中的方法。

在这种情况下,我真正想做的就是在输入数据时关闭numberPad。我首先尝试将SceneDelegate修改为在点击时关闭,但是仅当我在另一个文本或文本字段视图中而不是在视图的开放空间中单击时,此方法才起作用。

window.rootViewController = UIHostingController(rootView: contentView.onTapGesture {
    window.endEditing(true)
})

理想情况下,我会将“完成”键添加到左下角。其次,如果可以在SwiftUI中完成,则添加一个工具栏。

在此处输入图片说明

任何指导将不胜感激。

Xcode版本11.2.1(11B500)

Answers:


6

使用UIRepresentable协议解决了该问题

 struct TestTextfield: UIViewRepresentable {
    @Binding var text: String
    var keyType: UIKeyboardType
    func makeUIView(context: Context) -> UITextField {
        let textfield = UITextField()
      textfield.keyboardType = keyType
        let toolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: textfield.frame.size.width, height: 44))
        let doneButton = UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(textfield.doneButtonTapped(button:)))
        toolBar.items = [doneButton]
        toolBar.setItems([doneButton], animated: true)
        textfield.inputAccessoryView = toolBar
        return textfield
    }

    func updateUIView(_ uiView: UITextField, context: Context) {
        uiView.text = text

    }
}

extension  UITextField{
    @objc func doneButtonTapped(button:UIBarButtonItem) -> Void {
       self.resignFirstResponder()
    }

}

在内容视图中使用

struct ContentView : View {
@State var text = ""

var body: some View {
    TestTextfield(text: $text, keyType: UIKeyboardType.phonePad)
        .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: 50)
        .overlay(
            RoundedRectangle(cornerRadius: 16)
                .stroke(Color.blue, lineWidth: 4)
    )
}

}


1
我希望有一个纯粹的SwiftUI解决方案-但我认为您是正确的-没有一个。
user2698617

最好实现一个由实例化的协调器,makeCoordinator()并将其用于委派和选择器目标。我同意其他意见,似乎还没有纯粹的SwiftUI解决方案。
比约恩奥拉夫范尼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.