我花了很多时间并得出结论:UIDatePicker
将presentModalViewController:
减慢了几秒钟。我有一个视图控制器,有两个按钮和一个日期选择器。在另一个类中,我使用以下代码呈现此视图控制器:
RandomClass *class = [[RandomClass alloc] init];
[class setModalTransitionStyle: UIModalTransitionStyleCrossDissolve]; //an animation
[self presentModalViewController: class animated: YES];
[class release];
我已删除了RandomClass
中的日期选择器,并注意到我可以相当快地呈现RandomClass
,当我在视图中插入日期选择器时,它会再次减慢速度。我试图以编程方式添加日期选择器,并在不同的线程中呈现模态视图控制器,但仍然存在滞后。
你有同样的问题吗?你知道怎么解决吗?我非常感谢您的回答和帮助。谢谢!
答案 0 :(得分:7)
要解决UIDatePicker的性能问题,请以编程方式创建选择器,并仅在viewDidAppear中创建。例如,如果在viewDidLoad中创建它,慢实例化将阻止视图出现在屏幕上。
答案 1 :(得分:7)
我在模态视图演示中遇到了同样迟缓的表现。我通过牺牲一些记忆来支持性能来达到解决方案。
<强>背景强> 我的应用程序使用的是Model-View-Controller-Store模型。商店是一个单身人员,负责照顾我的模型,因此一旦实例化,它几乎可以从我的任何类中访问。我正在使用Store类通过属性来保留某些昂贵的类(例如NSCalendar,NSDateFormatter等)。
<强> SOLUTION:强>
我在Store单例中创建了一个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];