カスタムボタンでSwiftUIキーボードを拡張する


10

SwiftUI numberPadにキーまたはボタンを追加する方法を見つけようとしています。私が見つけた唯一の参考文献はそれが不可能であると言います。Swiftの世界では、キーボードを非表示にするか、他の機能を実行するためのボタンを備えたツールバーを追加しました。

ボタンを上にしてZStackビューを作成することもできますが、自分のビューにnumberPadを追加する方法が見つかりません。

この場合に私が本当にしようとしているのは、データが入力されたときにnumberPadを閉じることだけです。最初にタップで非表示にするようにSceneDelegateを変更しようとしましたが、それが機能するのは、ビューのオープンスペースではない別のテキストまたはテキストフィールドビューをタップした場合のみです。

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

理想的には、左下のスペースにDoneキーを追加します。SwiftUIで実行できる場合は、2番目に最適なツールバーを追加します。

ここに画像の説明を入力してください

どんなガイダンスもいただければ幸いです。

Xcodeバージョン11.2.1(11B500)

回答:


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ソリューションはまだ存在していないようです。
ビョルンオラフルード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.