正文
didMoveToSuperview方法认识和使用
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
由来:
今天给项目添加新功能——点击弹出阳历,阴历日期选择。
弹出日期选择是弹出的控制器,里面的日期选择控件是封装的View,View使用Xib画的,
遇到的问题是:控制器传数据给View,在awakeFromNib里面进行DatePicker设置去数据是nil。
解决办法:
1.直接在didSet方法配置datePicker:
var defaultBirthday: String? {
didSet {
let dformatter = DateFormatter()
dformatter.dateFormat = "yyyy-MM-dd"
datePicker.datePickerMode = .date
//将日期选择器区域设置为中文,则选择器日期显示为中文
datePicker.locale = Locale(identifier: "zh_CN")
datePicker.maximumDate = Date()
// 时区
let GMTzone = NSTimeZone.init(forSecondsFromGMT: )
dformatter.timeZone = GMTzone as TimeZone! // 当前日期
let date = Date()
let strNowTime = dformatter.string(from: date) as String
var firstDate: Date = dformatter.date(from: strNowTime)! if (defaultBirthday?.length != ) {
firstDate = dformatter.date(from: defaultBirthday!)!
}
let dateString: String = dformatter.string(from: firstDate) as String
firstDate = dformatter.date(from: dateString)! // 设置默认时间
datePicker.setDate(firstDate, animated: true)
datePicker.addTarget(self, action: #selector(dateChanged),
for: .valueChanged)
}
}
2.在didMoveToSuperview方法设置datePicker数据即可:
override func didMoveToSuperview() {
super.didMoveToSuperview()
}
总结:
1.didMoveToSuperview方法官方解释如下:
Tells the view that its superview changed.
大致意思: 当view的父级视图更改的时候会调用此方法。
The default implementation of this method does nothing. Subclasses can override it to perform additional actions whenever the superview changes.
大致意思:此方法默认实现,不做任何操作。子视图可以实现此方法,添加自己所需要的功能
通过以上我们可以理解为 此方法在view被添加新的父级视图的时候会调用。
现在是不是明白为什么在awakeFromNib取值是nil,在didMoveToSuperview就可以取到值了。
2.String转Date的时候会造成时区问题差8个小时,解决方法如下:
//将日期选择器区域设置为中文,则选择器日期显示为中文
datePicker.locale = Locale(identifier: "zh_CN")
datePicker.maximumDate = Date()
// 时区
let GMTzone = NSTimeZone.init(forSecondsFromGMT: )
dformatter.timeZone = GMTzone as TimeZone!
3.系统的UIDatePicker控件不滚动控件是取不到当前日期值的,这个依产品需求吧,可以使用datePicker.date属性直接取当前日期即可。
暂时记录这么多,后续会遇到问题,解决问题,记录问题哟