Я использую пользовательское текстовое поле для отображения даты выбора и просмотра.Я добавил UIToolBar как inputAccessoryView
.Я добавил готово и отменил кнопку., когда я нажимаю «Готово» и кнопку «Отмена» работает нормально в iOS 11 .Но в iOS 12 приложение вылетает при нажатии кнопки бара.Завершение работы приложения из-за необработанного исключения 'NSInvalidArgumentException', причина: '- [_ UIButtonBarButton _setContentCoverViewMode:] : нераспознанный селектор отправлен в экземпляр.
@IBDesignable
final class ICTextField: UITextField {
private var pickerView: UIPickerView?
/// To show the date or time input from textfield set this value to true
/// Default is false.
@IBInspectable open var isDatePicker: Bool = false {
didSet {
if self.isDatePicker {
self.inputView = self.datePicker
self.inputAccessoryView = self.configureToolBar()
}
self.reloadInputViews()
}
}
/// Shows the inputview as UITableView. able to select multiple option, default is false
@IBInspectable open var isDropDown: Bool = false {
didSet {
if isDropDown {
self.pickerView = UIPickerView()
self.pickerView?.dataSource = self
self.pickerView?.delegate = self
self.inputAccessoryView = self.configureToolBar()
self.inputView = self.pickerView
self.reloadInputViews()
} else {
self.inputView = nil
self.reloadInputViews()
}
}
}
// MARK: - Public Properties
let datePicker: UIDatePicker = {
let dateDropDown = UIDatePicker()
dateDropDown.datePickerMode = .date
dateDropDown.locale = Locale(identifier: "en_US_POSIX")
dateDropDown.addTarget(self, action: #selector(ICTextField.datePickerValueChanged(sender:)), for: .valueChanged)
return dateDropDown
}()
/// Tool bar to show cancel and done on top of textfield.
open var accessoryToolBar: UIToolbar? {
didSet {
self.inputAccessoryView = accessoryToolBar
self.reloadInputViews()
}
}
private func configureToolBar() -> UIToolbar {
let frame = CGRect(x: 0, y: 0, width: self.frame.width, height: 40.0)
let toolBar = UIToolbar(frame: frame)
toolBar.barStyle = .default
toolBar.barTintColor = UIColor(hex: "4db8ff")
let doneButton = UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(donePressed))
let cancelButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(cancelPressed))
let spaceButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false)
toolBar.isUserInteractionEnabled = true
toolBar.sizeToFit()
return toolBar
}
@objc fileprivate func donePressed() {
self.resignFirstResponder()
}
@objc private func cancelPressed() {
self.resignFirstResponder()
}
}
В viewcontroller я использую этот объект textField.
icTextField.isDatePicker = true
Обновление
Приложение выходит из строя, когда клавиатура открыта, и оносодержит вспомогательный вид в качестве панели инструментов.Теперь, если я нажимаю кнопку навигации на панели навигации или кнопку панели инструментов, происходит сбой приложения.Я думаю, что это ошибка яблока.кто-нибудь нашел решение.