iOS 7打开带有UIPickerView的UITableViewController很慢

3
根据这个问题和KyleC的友好回答,我已经实现了一个UITableViewController,它有很多行依赖于从Core Data获取的数据。每一行显示一个简单的NSString(获取的对象名称),并且有一个隐藏的UIPickerView。
问题在于,当我点击前面的UITableViewController中的行,打开带有picker视图的UITableViewController时,转场会有一些延迟,这是非常明显的。
我知道这是因为前面的控制器(它们甚至执行Core Data请求)在转场时没有那么慢。

-

有些 UIPickerView 转换速度缓慢且外观不佳,应该在哪种模式下使用 Instruments 以了解哪个是速度缓慢的罪魁祸首?

更重要的是:如果速度缓慢是由于 UIPickerView 的数目导致的,我该如何优化?

我想澄清的是,该应用程序非常轻巧,从 Core Data 提取的对象仅有4个,并使用了4个 UIPickerView


1
这是相关的:http://blog.ittybittyapps.com/blog/2013/09/20/lifting-the-lid-on-ios-7s-uipicker/ - Enrico Susatyo
1个回答

9
看起来从storyboards(可能还包括xib,但我没有尝试过)加载UIPickerViews和UIDatePickers非常缓慢。在iPad Air上,加载一个静态的UITableViewController,其中包含4个UIPickerViews和8个UIDatePickers在“隐藏”单元格中需要大约3秒钟。(对于最新和最好的硬件运行的本地UI来说,3秒钟是一个漫长的时间!)
我找到的解决方法是在隐藏行被展示之前以编程方式创建UIPickerViews和UIDatePickers。我的做法是在Interface Builder中创建空单元格,将这些单元格链接到IBOutlet属性,然后使用以下方法创建DatePickers和Picker视图:
- (UIDatePicker*)datePickerForCell:(UITableViewCell*)cell {
    UIDatePicker * datePicker = [[UIDatePicker alloc] initWithFrame:cell.bounds];
    [datePicker setDatePickerMode:UIDatePickerModeDateAndTime];
    [datePicker addTarget:self action:@selector(pickerDateChanged:) forControlEvents:UIControlEventValueChanged];
    datePicker.hidden = YES;
    [cell addSubview:datePicker];

    return datePicker;
}

- (UIPickerView*)pickerViewForCell:(UITableViewCell*)cell {
    UIPickerView * picker = [[UIPickerView alloc] initWithFrame:cell.bounds];
    [picker setDelegate:self];
    [picker setDataSource:self];
    picker.hidden = YES;
    [cell addSubview:picker];
    return picker;
}

这样可以将UITableViewController的加载时间缩短到几分之一秒,而且不会影响显示隐藏tableview的动画。
注意:我尝试在viewDidAppear:方法中创建选择器,但仍然会延迟UI。

非常好的答案,很多开发人员没有注意到这个延迟,但是它一直让我感到不安,花了我一些时间才将其缩小到日期选择器。 - EmilDo
我在使用通过Storyboard添加的日期选择器的静态单元格的uitableview中遇到了非常慢的加载时间。我只是从storyboard中删除了我的datapickers,添加了两个函数(类似于您的datePickerForCell函数),并在viewwillappear中调用了这两个函数,现在一切都快多了。虽然不像没有日期选择器那么快,但可能只需要1/3秒而不是3秒,这很好。干杯! - LpLrich
我简直无法相信这是正确的答案,但是我进行了一些测量,表明它确实是正确的。在XIB中拥有一个日期选择器会使我们的加载时间增加1.589秒,而在程序中创建它仅会增加1.007秒。当然,这仍然是完全不可接受的时间量,但知道这一点很好。看起来懒加载/重用实例是正确的方法。 - Ryan Pendleton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接