iOS OC开发:自定义代理传最小日期后DatePicker仍不生效
解决PickerController中DatePicker最小日期不生效的问题
嘿,我看了你的代码,发现问题根源在于PickerController的View还没加载完成时,你就尝试去设置datePicker的属性了。iOS里UIViewController的View是懒加载机制——只有当你主动访问它的view(比如添加到父视图、直接调用[objContent view])时,系统才会加载View并初始化所有IBOutlet(也就是你的datePicker)。
看你在displayContentView里的执行顺序:
- 实例化了
objContent(PickerController) - 直接操作
objContent.datePicker.hidden = false——这时候datePicker还是nil,因为View还没加载 - 调用
[self.dtDelegate setMinDate:minimumDate]——同样,self.datePicker是nil,设置minimumDate完全没效果 - 之后才把
objContent添加为子控制器、把View加到父视图里
所以哪怕你在setMinDate里打印了minDate,但因为datePicker是空的,设置操作等于没执行。
两种可行的修复方案
方案1:提前触发View加载
在调用setMinDate之前,主动访问objContent.view,强制系统加载View并初始化IBOutlet:
- (void)displayContentView { UIStoryboard *story=[UIStoryboard storyboardWithName:@"Pagebar" bundle:nil]; objContent=[story instantiateViewControllerWithIdentifier:@"pickerVCID"]; // 提前访问view,触发懒加载,让datePicker初始化完成 [objContent view]; objContent.datePicker.hidden = NO; self.dtDelegate = objContent; objContent.view.frame = CGRectMake(0, 0, self.view.frame.size.width, 280); if (!isFromDate) { [self.dtDelegate setMinDate:minimumDate]; } _pickerContainerVw.hidden = NO; [self addChildViewController:objContent]; [self.view addSubview:_pickerContainerVw]; [objContent didMoveToParentViewController:self]; }
方案2:用属性存值,View加载后再应用(更规范)
这种方式不需要依赖View加载时机,代码更健壮:
- 先给PickerController加一个存储最小日期的属性:
// PickerController.h @property (nonatomic, strong) NSDate *minimumDate;
- 在PickerController的
viewDidLoad里,用这个属性设置datePicker:
// PickerController.m - (void)viewDidLoad { [super viewDidLoad]; // View加载完成后,datePicker已经初始化,再设置最小日期 if (self.minimumDate) { [self.datePicker setMinimumDate:self.minimumDate]; } }
- 然后在CalendarVC里直接给这个属性赋值就行,不用代理方法(如果想保留代理也可以,但逻辑要移到viewDidLoad):
- (void)displayContentView { UIStoryboard *story=[UIStoryboard storyboardWithName:@"Pagebar" bundle:nil]; objContent=[story instantiateViewControllerWithIdentifier:@"pickerVCID"]; self.dtDelegate=objContent; objContent.view.frame=CGRectMake(0,0, self.view.frame.size.width, 280); if (!isFromDate) { // 直接赋值属性,View加载后会自动生效 objContent.minimumDate = minimumDate; } objContent.datePicker.hidden = NO; // 现在View加载后datePicker不为nil了 _pickerContainerVw.hidden = NO; [self addChildViewController:objContent]; [self.view addSubview:_pickerContainerVw]; [objContent didMoveToParentViewController:self]; }
额外检查点
- 确认你的
datePickerIBOutlet已经正确连接到Storyboard中的控件,别因为连线错误导致datePicker一直是nil - 调用前先打印
minimumDate,确保这个值不是nil,且是你期望的日期
内容的提问来源于stack exchange,提问作者Nirav Zalavadia
相关产品推荐
相关产品推荐

