iOS 7 用 UIPickerView 打开 UITableViewController 很慢

Posted

技术标签:

【中文标题】iOS 7 用 UIPickerView 打开 UITableViewController 很慢【英文标题】:iOS 7 slow to open UITableViewController with UIPickerView 【发布时间】:2013-10-08 04:18:31 【问题描述】:

根据this question 和KyleC 的友好回答,我实现了一个UITableViewController,它有很多行依赖于从Core Data 获取。每行显示一个简单的NSString(获取的对象的名称)并隐藏了一个UIPickerView

问题是,当我点击前一个UITableViewController 中打开带有选择器视图的UITableViewController 的行时,很明显,segue 转换存在一些延迟。

我知道这一点是因为以前的控制器(它们甚至执行核心数据请求)在转换过程中并没有那么慢。

-

一些UIPickerViews 可以让过渡变得如此缓慢和丑陋吗? 我应该在哪种模式下使用 Instruments 来了解哪个是慢慢内疚的?

更重要的是:如果速度慢来自UIPickerViews 的数量,我该如何优化?

我想澄清一下,这个应用程序非常轻量级,从Core Data中获取的对象只有4个,有4个UIPickerViews。

【问题讨论】:

这是相关的:blog.ittybittyapps.com/blog/2013/09/20/… 【参考方案1】:

似乎 UIPickerViews 和 UIDatePickers 从情节提要加载非常缓慢(可能还有 xib,但我没有尝试过)。在 iPad Air 上,加载一个静态 UITableViewController 大约需要 3 秒,该控制器在“隐藏”单元格中包含 4 个 UIPickerViews 和 8 个 UIDatePickers。 (对于在最新最好的硬件上运行的原生 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。

【讨论】:

那里的答案很好,很多开发人员没有注意到这种滞后,但这让我紧张了一段时间,我花了更多时间将其缩小到日期选择器。 使用已通过情节提要添加的日期选择器,对于带有静态单元格的 uitableview,加载时间真的很慢。我只是从情节提要中删除了我的数据选择器,添加了两个函数,比如你的 datePickerForCell 函数和两条从视图中调用它们的行,一切都会快得多。不像没有日期选择器那样快,可能是 1/3 秒而不是 3 秒,所以这很好。干杯 我不敢相信这是正确的答案,但我进行了一些测量,表明它确实是正确的。在 XIB 中使用日期选择器将我们的加载时间增加了 1.589 秒,而以编程方式创建它仅增加了 1.007 秒。当然,这仍然是一个完全不可接受的时间,但很高兴知道。看起来懒加载/重用实例是要走的路。

以上是关于iOS 7 用 UIPickerView 打开 UITableViewController 很慢的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 7 中重用 UIPickerView 中的视图

iOS 7 中用于点击截断的 UIPickerView 交互区域

UIPickerView 在 iOS 7 中不显示数据

如何在iOS 7中更改UIPickerView中的文本字体?

iOS 7 中的自定义 UIPickerView 崩溃

ios 7 中带有一个组件的自定义 UIPickerView