У меня есть представление коллекции, в котором метка используется в заголовке. Я хочу показать датупикер при нажатии на эту метку. Была создана настраиваемая метка выбора даты, однако я не знаю, как использовать эту метку выбора даты в моем контроллере, как в настоящее время datepicker не отображается при нажатии метки заголовка даты.
class DatePickerLabel: UILabel {
private let _inputView: UIView? = {
let picker = UIDatePicker()
return picker
}()
private let _inputAccessoryToolbar: UIToolbar = {
let toolBar = UIToolbar()
toolBar.barStyle = UIBarStyle.default
toolBar.isTranslucent = true
toolBar.sizeToFit()
return toolBar
}()
override var inputView: UIView? {
return _inputView
}
override var inputAccessoryView: UIView? {
return _inputAccessoryToolbar
}
required init() {
super.init(frame: CGRect.zero)
let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.plain, target: self, action: #selector(doneClick))
let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
_inputAccessoryToolbar.setItems([ spaceButton, doneButton], animated: false)
let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(launchPicker))
self.addGestureRecognizer(tapRecognizer)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override var canBecomeFirstResponder: Bool {
return true
}
@objc private func launchPicker() {
becomeFirstResponder()
}
@objc private func doneClick() {
resignFirstResponder()
}
}
Пользовательский класс заголовка: -
class DetailHeader : UICollectionReusableView
{
@IBOutlet weak var paramName : UILabel!
@IBOutlet weak var paramDate : DatePickerLabel!
}
Мой код viewController -
func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
if (kind == UICollectionElementKindSectionHeader){
let sectionHeader = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: headerreuseIdentifier, for: indexPath) as! DetailHeader
sectionHeader.paramName.text = selectedParam?.name
sectionHeader.paramDate.text = dateToString(date: stringToDate(strdate: (detailList?.date)!))
sectionHeader.paramDate = DatePickerLabel()
return sectionHeader
}
}





Вы не включили взаимодействие с пользователем в вашем DatePickerLabel. Значение isUserInteractionEnabled по умолчанию - false. Так что переопределите это в вашем DatePickerLabel
override var isUserInteractionEnabled: Bool {
return true
}
И ваш init никогда не вызывается. Потому что в случае Nib / Storyboard вызывается init(coder aDecoder: NSCoder). Переместите свой код из init в init(coder aDecoder: NSCoder), и он начнет работать.
Понятно. Ваше приложение вылетает? потому что paramDate не является необязательным, поэтому он должен аварийно завершить работу, если он равен нулю. А что с paramName? это тоже ноль?
Нет, это не сбой, но при нажатии метки datePicker не появляется. Мне нужно добавить какой-то делегат в viewcontroller или что-то еще? .Param name в порядке, оно показывает значение, для которого он предназначен.
Но когда я удалил sectionHeader.paramDate = DatePickerLabel () из viewcontroller, paramDate не равен нулю.
Я запустил ваш код и обнаружил проблему. Ваш init никогда не вызывается. Потому что в случае Nib / Storyboard вызывается init(coder aDecoder: NSCoder). Переместите свой код с init на init(coder aDecoder: NSCoder), и он начнет работать.
И не забудьте установить isUserInteractionEnabled на true.
Спасибо @Ehsan за предложенный перенос кода внутри init (кодер aDecoder: NSCoder) сработал.
Я попытался сделать DatePickerLabel UserInteractionEnabled с помощью xcode, а также через код в конструкторе с помощью self.isUserInteractionEnabled = true, но не работал. На самом деле я получаю paramDate nil, поэтому при инициализации DatePickerLabel в контроллере чего-то не хватает.