Расширьте клавиатуру SwiftUI с помощью пользовательской кнопки

10

Я пытаюсь найти способ добавить ключ или кнопку в цифровую панель SwiftUI. Единственные ссылки, которые я нашел, говорят, что это невозможно. В мире Swift я добавил панель инструментов с кнопкой, чтобы убрать клавиатуру или выполнить какую-то другую функцию.

Я бы даже построил представление ZStack с кнопкой сверху, но не могу найти способ добавить numberPad к своему собственному представлению.

Все, что я действительно пытаюсь сделать в этом случае, это отклонить numberPad при вводе данных. Сначала я попытался изменить SceneDelegate для отклонения при нажатии, но это работает только в том случае, если я нажимаю в другом текстовом или текстовом представлении, а не в открытом пространстве в представлении.

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

В идеале, я бы добавил ключ Готово в левое нижнее пространство. Во-вторых, лучше всего добавить панель инструментов, если это можно сделать в SwiftUI.

введите описание изображения здесь

Любое руководство будет оценено.

Версия Xcode 11.2.1 (11B500)

user2698617
источник

Ответы:

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.
Бьёрн Олав Рууд