Розгорніть клавіатуру SwiftUI за допомогою спеціальної кнопки


10

Я намагаюся знайти спосіб додати ключ або кнопку до SwiftUI numberPad. Тільки знайдені нами посилання говорять, що це неможливо. У світі Swift я додав панель інструментів з кнопкою, щоб відхилити клавіатуру або виконати якусь іншу функцію.

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

Все, що я дійсно намагаюся зробити в цьому випадку, - це відхилити числоPad, коли дані вводяться. Я спершу спробував змінити SceneDelegate для відхилення на дотиках, але це працює лише в тому випадку, якщо я натискаю інший текст або перегляд текстового поля, а не у відкритому просторі на перегляді.

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

В ідеалі я б додавав клавішу Готово в нижньому лівому просторі. По-друге, краще додати панель інструментів, якщо це можна зробити в SwiftUI.

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

Будь-які вказівки будуть вдячні.

Версія 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 - але, я думаю, ви правильні - такого немає.
користувач2698617

Краще застосувати координатора, встановленого makeCoordinator()і використовувати його для делегування та вибору цілі. Я погоджуюся з іншими коментарями, схоже, чисте рішення SwiftUI ще не існує.
Bjørn Olav Ruud
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.