2013-10-08 6 views
3

Соответственно this question и ответ типа KyleC я внедрил UITableViewController, у которого много строк, основанных на выборке из Core Data. Каждая строка отображает простой NSString (имя объекта) и имеет скрытый файл UIPickerView.iOS 7 медленно открывается UITableViewController с UIPickerView

Проблема заключается в том, что совершенно очевидно, что когда я нажимаю строку в предыдущем UITableViewController, которая открывает UITableViewController с представлениями сборщика, есть некоторые задержки в переходе segue.

Я знаю это, потому что предыдущие контроллеры (они даже выполняют запросы Core Data) не так медленны при переходе.

-

Может некоторые UIPickerView s сделать переход настолько медленно и довольно коряво? В каком режиме я должен использовать Инструменты, чтобы понять, что является медленно виновным?

Важнее: если медлительность получается из чисел UIPickerView s, как я могу это оптимизировать?

Я хочу уточнить, что приложение очень светлое, а извлеченные объекты из Core Data - всего 4, с 4 UIPickerView s.

+1

Это актуально: http://blog.ittybittyapps.com/blog/2013/09/20/lifting-the-lid-on-ios-7s-uipicker/ –

ответ

9

Кажется, что UIPickerViews и UIDatePickers загружаются очень медленно из раскадровки (и, возможно, xib, но я не пробовал). На iPad Air требуется около 3 секунд для загрузки статического UITableViewController, который содержит 4 UIPickerViews и 8 UIDatePickers в «скрытых» ячейках. (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 до нескольких десятых второй, и, похоже, это не влияет на анимацию отображения скрытого вида таблицы.

Примечание. Я попытался создать сборщики в методе viewDidAppear: но он все еще, казалось, задерживал интерфейс.

+0

Отличный ответ там, много разработчиков не делают заметьте это отставание, но это немного нервировало меня, и потребовалось немного больше, чтобы сузить его до выбора даты. – EmilDo

+0

Я получал очень медленное время загрузки для uitableview со статическими ячейками, используя датпикер, который был добавлен через раскадровку. Я просто удалил своих datapickers из раскадровки, добавил две функции, такие как ваша функция datePickerForCell, и две строки, вызывающие их из viewwillappear, все намного быстрее. Не так быстро, как без datepickers, возможно 1/3 секунды, а не 3 секунды, так что это хорошо. Cheers – LpLrich

+0

Я не мог поверить, что это был правильный ответ, но я сделал несколько измерений, которые показывают, что это действительно правильно. Наличие выбора даты в XIB увеличило время загрузки на 1,589 секунды, а его создание программно увеличило его на 1,007 секунды. Конечно, это все еще совершенно неприемлемое количество времени, но приятно знать. Похоже, что ленивая загрузка/повторное использование экземпляра - это путь. –

Смежные вопросы