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

问题是,当我点击前一个 UITableViewController 中的行以使用选择器 View 打开 UITableViewController 时,很明显,segue 转换有一些延迟。

我知道这一点是因为之前的 Controller (它们甚至执行 Core Data 请求)在转换过程中并没有那么慢。

——

一些 UIPickerView 可以使转换变得如此缓慢和丑陋吗?
我应该在哪种模式下使用 Instruments 来了解哪个是缓慢的罪?

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

我想澄清一下,该应用程序非常轻巧,从 Core Data 中获取的对象只有 4 个,其中有 4 个 UIPickerView

最佳答案

似乎 UIPickerViews 和 UIDatePickers 从 Storyboard(可能还有 xib 的,但我没有尝试过)加载非常缓慢。在 iPad Air 上,加载包含 4 个 UIPickerViews 和 8 个 UIDatePickers 的静态 UITableViewController 需要大约 3 秒的时间。 (对于在最新最好的硬件上运行的 native UI 来说,3 秒是永恒的!)

我发现的解决方法是在隐藏行显示之前以编程方式创建 UIPickerViews 和 UIDatePickers。我所做的是在 Interface Builder 中创建空单元格,将这些单元格链接到 IBOutlet 属性,然后使用以下方法创建 DatePickers 和 Picker View :

- (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。

关于iOS 7 用 UIPickerView 打开 UITableViewController 很慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19239003/

10-14 22:39