iOS 7使用UIPickerView缓慢打开UITableViewController

iOS 7使用UIPickerView缓慢打开UITableViewController,ios,objective-c,uitableview,optimization,uipickerview,Ios,Objective C,Uitableview,Optimization,Uipickerview,根据KyleC的回答,我实现了一个UITableViewController,它有许多行依赖于从核心数据获取。每行显示一个简单的NSString(获取的对象的名称),并隐藏一个UIPickerView 问题是,当我点击上一个UITableViewController中打开带有选择器视图的UITableViewController的行时,很明显在序列转换中有一些延迟 我之所以知道这一点,是因为以前的控制器(它们甚至执行核心数据请求)在转换过程中并没有那么慢 - 一些UIPickerViews会让过

根据KyleC的回答,我实现了一个
UITableViewController
,它有许多行依赖于从核心数据获取。每行显示一个简单的
NSString
(获取的对象的名称),并隐藏一个
UIPickerView

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

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

-

一些
UIPickerView
s会让过渡变得如此缓慢和丑陋吗? 在哪种模式下,我应该使用仪器来了解哪一种是缓慢有罪的

更重要的是:如果慢度来自
UIPickerView
s的数量,我如何优化它


我想澄清一下,该应用程序非常轻巧,从核心数据中获取的对象只有4个,其中4个
UIPickerView
s.

似乎UIPickerViews和uidatepicker从情节提要加载得非常慢(可能还有xib,但我还没有尝试)。在iPadAir上,加载一个静态UITableViewController大约需要3秒钟,其中包含4个UIPickerViews和8个UIDatePicker,位于“隐藏”单元格中。(对于运行在最新和最好的硬件上的本机UI来说,3秒是永恒的!)

我找到的解决方法是在显示隐藏行之前以编程方式创建UIPickerViews和UIDatePicker。我所做的是在Interface Builder中创建空单元格,将这些单元格链接到IBOutlet属性,然后使用以下方法创建日期选择器和选择器视图:

- (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的动画


注意:我确实尝试过在viewdide:method中创建选择器,但它似乎仍然延迟了UI。

这是相关的:答案很好,很多开发人员没有注意到这个延迟,但它让我紧张了一段时间,我花了更多的时间将其缩小到日期选择器。我使用通过故事板添加的日期选择器,使用静态单元格的uitableview的加载时间非常慢。我只是从情节提要中删除了我的数据采集器,添加了两个函数,比如datePickerForCell函数,并在视图中调用了两行代码,这样一切都会更快。速度不如没有日期选择器时快,可能是1/3秒而不是3秒,所以这很好。我不敢相信这是正确的答案,但我做了一些测量,表明这确实是正确的。在XIB中使用日期选择器将加载时间增加了1.589秒,而通过编程方式创建它只增加了1.007秒。当然,这仍然是一个完全不能接受的时间量,但很高兴知道。看起来惰性地加载/重用一个实例是可行的。