UITextField inputView не работает в Swift
Я пытаюсь установить inputView
& inputAccessoryView
за UITextField
, Но, когда я начинаю нажимать только на textField inputAccessoryView
это снизу.
Ниже приведен мой код:
@IBOutlet weak var pickerView: UIPickerView!
@IBOutlet weak var textField: UITextField!
@IBOutlet weak var toolBar: UIToolbar!
override func viewDidLoad() {
super.viewDidLoad()
self.textField.inputView = self.pickerView;
self.textField.inputAccessoryView = self.toolBar;
}
Заранее спасибо.
5 ответов
Я был очень удивлен, когда увидел такую ошибку! Ваш код выглядит на 100% действительным и должен работать. Я даже создал небольшой проект, чтобы воспроизвести проблему. И удалось с размножением.
Итак, мои шаги были:
Создайте простой проект с
UITextView
в Xib, который создается вapplication(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!)
, Запустите и увидите, что клавиатура по умолчанию отображается.Добавьте еще два представления в Xib и подключите их к MyViewController. И установить
inputView
а такжеaccessoryInputView
вviewDidLoad
как ты.Запустите и увидите проблему.
Ответ начинается здесь:
Затем я просто сбросил эмулятор, почистил папку сборки и снова запустил код. И все заработало как положено!
Это выглядит для меня как ошибка с xCode или эмулятором (или может быть и тем и другим), но я не могу сказать, кто виноват и почему.
Снимок экрана (вид с помощью кнопок - моя клавиатура:)
Так что ответ гораздо проще, получается. Если вы используете аппаратную клавиатуру вместо программной клавиатуры, симулятор включит настройку "Подключить аппаратную клавиатуру", и вы больше не получите программную клавиатуру. Причина, по которой предлагаемый сброс вашего симулятора работает, заключается в том, что он также сбрасывает этот параметр. Если вы не хотите делать полный сброс, просто выключите аппаратную клавиатуру, выполнив:
Оборудование -> Клавиатура -> и убедитесь, что "Подключить аппаратную клавиатуру" не отмечено
Вы можете создавать эти представления программно.
weak var pickerView: UIPickerView!
weak var toolBar: UIToolbar!
@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
var picker = UIPickerView()
picker.delegate = self
picker.dataSource = self
self.pickerView = picker
self.textField.inputView = pickerView
var toolbar = UIToolbar(frame: CGRectMake(0, 0, self.view.bounds.size.width, 44))
var item = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Done,
target: self, action: "doneAction")
toolbar.setItems([item], animated: true)
self.textField.inputAccessoryView = toolbar
self.toolBar = toolbar
}
func doneAction() {
self.textField.resignFirstResponder()
println("done!")
}
Это сработало для меня, потому что установка inputView добавила представление в раскадровку, но ни один из параметров внешнего вида не сработал, и viewDidLoad() не вызывался.
self.inputText?.inputViewController?.view.addSubview(self.basicKeyboard)
self.inputText!.inputView = self.basicKeyboard
self.inputText!.inputAccessoryView = nil
- Убедитесь, что вы переопределите
canBecomeFirstResponder
на ваш взгляд контроллер и верните истину. (По умолчанию установлено значение false) - Переопределить
inputAccessoryView
свойство в вашем контроллере представления и вернуть представление по вашему выбору. ВНИМАНИЕ: Убедитесь, что вы удалили его из суперпредставления, прежде чем вернуть его. (Но это может быть вид, созданный в IB и связанный через выход)