我花了一个很好的时间,并得出结论,UIDatePicker使presentModalViewController慢了几秒钟.我有一个视图控制器与两个按钮和日期选择器.在另一个类中,我使用这个代码来呈现这个视图控制器:
RandomClass *class = [[RandomClass alloc] init]; [class setModalTransitionStyle: UIModalTransitionStyleCrossDissolve]; //an animation [self presentModalViewController: class animated: YES]; [class release];
我已经删除了RandomClass中的日期选择器,并注意到我可以很快地呈现RandomClass,当我在视图中插入日期选择器时,它会再次减慢事情.我试图以编程方式添加日期选择器,并以不同的线程呈现模态视图控制器,但仍然存在滞后.
你有同样的问题吗?你知道如何解决它吗?我非常感谢你的答案和帮助.谢谢!
解决方法
我正在经历与模态视图演示相同的缓慢表现.我通过牺牲一些记忆来支持表现来到一个解决方案.
背景:
我的应用程序正在使用Model-View-Controller-Store模型.商店是一个照顾我的模型的单身,因此,一旦实例化,它几乎可以从任何一个类中访问.我正在使用Store类通过属性来保持某些昂贵的类(如NSCalendar,NSDateFormatter等).
解:
我在仓库单身人士中打了一个UIDatePicker属性,允许通过任何类访问它.
在Singleton的界面中:
@property (strong,nonatomic) UIDatePicker *datePicker;
在Singleton的实现中,我为datePicker实现了一个getter.
- (UIDatePicker *)datePicker { if (!_datePicker) { _datePicker = [[UIDatePicker alloc] init]; } return _datePicker; }
这确保了datePicker只被创建一次,它可以从我的应用程序的任何地方访问.
现在在需要使用选择器的类的viewDidLoad方法中,通过getter方法获取属性:
UIDatePicker *aDatePicker = [[MySingleton shareInstance] datePicker]; // Set it's location. [aDatePicker setFrame:CGRectMake(0.0,236.0,self.view.frame.size.width,216.0)]; // Connect to any actions [aDatePicker addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged]; // Add it to you view [self.view addSubview:[[MySingleton shareInstance] datePicker]];
第一次创建日期选择器时,会发生缓慢的行为.每隔一段时间,模态视图就会看起来很快(取决于你在视图中还有什么).
本质上我正在创建一个全局变量并保持它,所以我不必每次创建它,而是以内存为代价.性能差异在我的应用案例中是值得的.
注意:
有一个值得注意的注意事项.由于datePicker很可能会超出模态视图,因此必须确保datePicker不指向任何释放的内存.
所以如果在viewDidLoad中将“self”分配为目标:
[aDatePicker addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];
重要的是在诸如viewDidDisappear之类的方法中添加此代码以防止崩溃:
[aDatePicker removeTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];