Почему мой текстовый редактор в SwiftUI игнорирует мой .keyboardType?

#ios #swift #swiftui

#iOS #swift #swiftui

Вопрос:

Я пытаюсь использовать a TextEditor() в SwiftUI и понадобится .keyboardType(.numberPad) . К сожалению, всякий раз, когда я устанавливаю этот параметр, по какой-то причине мое устройство и симулятор, похоже, полностью игнорируют его! Он просто показывает клавиатуру по умолчанию, независимо от того, что я установил в качестве опции клавиатуры.

Кто-нибудь знает, почему это может быть? Я тестировал бета-версии iOS 14.0 и 14.2 с помощью Xcode 12 Beta 2.

Комментарии:

1. У меня такая же проблема при попытке использовать клавиатуру .twitter. Похоже, это проблема с TextEditor, поскольку он отлично работает с текстовым полем. Если ваш номер не будет многострочным, возможно, вам подойдет текстовое поле?

2. Черт, я надеялся, что я просто слишком глуп, чтобы правильно его использовать. Пока я могу работать с текстовым полем, но TextEditor был бы намного лучше, поскольку он обеспечивает больший хитбокс внутри формы. Хотя спасибо за ответ. Означает, что я не единственный, и это, вероятно, ошибка на стороне Apple. Надеюсь, они скоро это исправят. 🙂

Ответ №1:

Вот уродливый обходной путь с использованием SwiftUI-Introspect

(FB8816771 — это идентификатор обратной связи, который я зарегистрировал в Apple.)

 private extension View {
    func keyboardType_FB8816771(_ type: UIKeyboardType) -> some View {
        let customise: (UITextView) -> () = { uiTextView in
            uiTextView.keyboardType = type
        }
        
        return introspect(selector: TargetViewSelector.siblingContaining, customize: customise)
    }
}
  

Ответ №2:

На случай, если это кому-нибудь поможет с тем фактом, что в TextEditor нет кнопки «Готово» … расширяя ответ Люка Говарда выше…

 import Introspect

extension View {
    func addDoneButton() -> some View {
        let helper = MainViewHelper()
        
        let customise: (UITextView) -> () = { uiTextView in
            let toolBar = UIToolbar(frame: CGRect(x: 0.0,
                                                  y: 0.0,
                                                  width: UIScreen.main.bounds.size.width,
                                                  height: 44.0))//1
            let flexible = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
            let barButton = UIBarButtonItem(title: "Done", style: .plain, target: uiTextView, action: #selector(helper.close))
            toolBar.setItems([flexible, barButton], animated: false)//4
            uiTextView.inputAccessoryView = toolBar
            uiTextView.keyboardAppearance = .light
        }
        
        return introspect(selector: TargetViewSelector.siblingContaining, customize: customise)
    }
}

class MainViewHelper {
    @objc func close() {
        
    }
}