11

我度过了一段美好的时光,并得出结论,这UIDatePicker会减慢presentModalViewController:几秒钟。我有一个带有两个按钮和一个日期选择器的视图控制器。在另一堂课中,我向这个视图控制器展示了这段代码:

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

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

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

4

2 回答 2

7

要解决 UIDatePicker 的性能问题,请以编程方式创建您的选择器,并且仅在 viewDidAppear 中。例如,如果您在 viewDidLoad 中创建它,缓慢的实例化将阻止视图出现在屏幕上。

于 2012-07-28T11:35:59.777 回答
7

我在模态视图演示中遇到了同样缓慢的性能。我通过牺牲一些内存来提高性能来找到解决方案。

背景: 我的应用程序使用的是 Model-View-Controller-Store 模型。Store 是一个处理我的模型的单例,因此一旦实例化,它几乎可以从我的任何类中访问。我使用 Store 类通过属性来避开某些昂贵的类(例如 NSCalendar、NSDateFormatter 等)。

解决方案:
我在 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];
于 2013-02-22T02:27:46.477 回答