swift 4 中的自定义日期选择器标签
Custom Datepicker Label in swift 4
我有一个 collectionview,其中使用了一个标签 header.i 想在这个标签是 clicked.a 时显示一个日期选择器 clicked.a 自定义日期选择器标签已经创建但是我不知道如何在我的控制器中使用此日期选择器标签,因为当前日期选择器在单击日期 header 标签时未显示。
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()
}
}
自定义 header class :-
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)
,它将开始工作。
我有一个 collectionview,其中使用了一个标签 header.i 想在这个标签是 clicked.a 时显示一个日期选择器 clicked.a 自定义日期选择器标签已经创建但是我不知道如何在我的控制器中使用此日期选择器标签,因为当前日期选择器在单击日期 header 标签时未显示。
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()
}
}
自定义 header class :-
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)
,它将开始工作。