UIDatePicker减慢了速度

时间:2012-06-24 05:31:53

标签: objective-c ios xcode uidatepicker

我花了很多时间并得出结论:UIDatePickerpresentModalViewController:减慢了几秒钟。我有一个视图控制器,有两个按钮和一个日期选择器。在另一个类中,我使用以下代码呈现此视图控制器:

RandomClass *class = [[RandomClass alloc] init];
[class setModalTransitionStyle: UIModalTransitionStyleCrossDissolve]; //an animation
[self presentModalViewController: class animated: YES];
[class release];

我已删除了RandomClass中的日期选择器,并注意到我可以相当快地呈现RandomClass,当我在视图中插入日期选择器时,它会再次减慢速度。我试图以编程方式添加日期选择器,并在不同的线程中呈现模态视图控制器,但仍然存在滞后。

你有同样的问题吗?你知道怎么解决吗?我非常感谢您的回答和帮助。谢谢!

2 个答案:

答案 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];