根据this question以及KyleC的答案,我实现了一个UITableViewController
,其中有许多行依赖于从核心数据中获取。每一行都显示一个简单的NSString
(获取的对象的名称),并隐藏UIPickerView
。
问题在于,当我点击上一个UITableViewController
中打开带有选择器视图的UITableViewController
的行时,就会发现segue转换有一些延迟。
我知道这是因为之前的控制器(它们甚至执行核心数据请求)在转换过程中并不是那么慢。
-
有些UIPickerView
可以使转换变得如此缓慢而且非常难看吗?
我应该在哪种模式下使用Instruments来了解哪些是慢慢的内疚?
更重要的是:如果缓慢来自UIPickerView
的数量,我该如何优化呢?
我想澄清一下,应用程序非常轻巧,Core Data中提取的对象只有4个,有UIPickerView
个。
答案 0 :(得分:9)
似乎UIPickerViews和UIDatePickers从故事板(可能是xib,但我还没试过)加载速度非常慢。在iPad Air上花费大约3秒钟加载一个静态UITableViewController,其中包含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:方法中创建选择器,但它似乎仍然延迟了用户界面。