SwiftUI numberPadにキーまたはボタンを追加する方法を見つけようとしています。私が見つけた唯一の参考文献はそれが不可能であると言います。 Swiftの世界では、キーボードを非表示にするか、他の機能を実行するためのボタンを備えたツールバーを追加しました。
ボタンを上にしてZStackビューを作成することもできますが、自分のビューにnumberPadを追加する方法が見つかりません。
この場合に私が本当にしようとしているのは、データが入力されたときにnumberPadを閉じることだけです。私は最初にタップで閉じるようにSceneDelegateを変更しようとしましたが、それはビューのオープンスペースにない別のテキストまたはテキストフィールドビューをタップした場合にのみ機能します。
window.rootViewController = UIHostingController(rootView: contentView.onTapGesture {
window.endEditing(true)
})
理想的には、左下のスペースにDoneキーを追加します。 SwiftUIで実行できる場合は、2番目に最適なツールバーを追加します。
どんなガイダンスもいただければ幸いです。
Xcodeバージョン11.2.1(11B500)
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)
)
}
}