2014-10-20 3 views
21

У меня есть приложение на основе панели вкладок. На всех 5 вкладках есть контроллеры навигации с примерами настройки пользовательского контроллера просмотра в качестве контроллеров корневого представления. Это очень просто. Пара этих контроллеров представлений содержит представления таблиц. Я хочу показать пользователю modal view, когда они выбирают строку в представлении таблицы. (Соответствующая часть) метода didSelectRowAtIndexPath делегата выглядит следующим образом:Задержка при представлении контроллера модального вида

SampleSelectorViewController *sampleVC = [[SampleSelectorViewController alloc] init]; 
[self presentViewController:sampleVC animated:YES completion:NULL]; 

модального контроллер вид появляется, но он появляется после очень заметной задержки. Время от времени даже требуется, чтобы пользователь второй раз нажал на строку. Несколько вещей, которые я уже проверены, являются: метод didSelectRowAtIndexPath

  • Просмотр таблицы, называется, когда пользователь вводит строку
  • Метод didSelectRowAtIndexPath не содержит каких-либо блокирующие вызовы. Операции сети не выполняются, и настройка контроллера модального просмотра не требует какой-либо интенсивной обработки. Отображаемые данные являются статическими.
  • Если я нажму новый контроллер просмотра в стек навигации (все остальное останется точно таким же), он будет вести себя отлично без каких-либо задержек. Только при условии, что встречаются задержки.

Любые идеи/предложения?

+0

Из интереса, это так же медленно с 'анимационного: NO' ? – pbasdf

+0

Это так. Кажется, что анимация не влияет на это странное поведение. –

+0

интересный.У меня та же проблема, что модальная презентация задерживается (или нужно нажать экран, чтобы он появился). в моем случае, это не напрямую, а косвенно вызвано didSelectRowAtIndexPath. который вызывает методы делегата, который вызывает метод делегирования, который представляет модально. hmm .. –

ответ

3

Вы должны отобразить его в моделях с вашего корневого vc (например: customTabBarRootViewController). сохраните ссылку и используйте контрольный контроллер для ее отображения.

+0

Когда вы говорите root vc , вы имеете в виду корневой vc в моем окне, который был бы моим контроллером панели вкладок в этом случае? Кроме того, мне было бы очень интересно узнать причину этого, если возможно –

+0

Я не знаю причину, я знаю, что он отлично работал для меня без задержки на iPhone 4, работающем под iOS7, скомпилированном по xCode6.0.1 – Gilad

+0

да, я имею в виду вкладку bar контроллер или контроллер, который удерживает его – Gilad

36

Кажется, что позвонить presentViewController:animated:completion изнутри tableView:didSelectRowAtIndexPath: проблематично. Трудно найти что-либо, что выделяется при использовании Time Profiler in Instruments. Иногда мой модальный вид появляется менее чем за секунду, а иногда и занимает 4 с или даже 9 секунд.

Я думаю, что это связано с базовым UIPresentationController и макетом, что является одной из немногих вещей, которые я вижу при выборе области времени между нажатием на строку и просмотром модальной презентации в Time Profiler.

радиолокационный существует описывающие этот вопрос: http://openradar.appspot.com/19563577

Обходного проста, но неудовлетворителен: немного задержать презентацию, чтобы избежать любой спорного поведения вызывает замедление.

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self presentViewController:nav animated:YES completion:nil]; 
}); 
+1

Спасибо за это. Ваше исправление работало для меня, хотя и согласилось, что оно немного неудовлетворительно. – Rogare

+1

Спасибо azsromej за ваш ответ. Я немного зациклен на некоторых других вещах. Я попытаюсь проверить исправление как можно скорее и принять ваш ответ, если он работает, но может быть немного, пока я не смогу это сделать. –

+0

Это исправляло это для меня http://stackoverflow.com/questions/29830698/uisearchcontroller-wont-dismiss-searchbar-and-overlap-for-ios-8-swift – DogCoffee

1

Я также имел эту странную задержку при представлении от tableView:didSelectRowAtIndexPath: выглядит как ошибка Apple.

Это решение, похоже, работает хорошо.

CFRunLoopWakeUp(CFRunLoopGetCurrent()); // Fixes a bug where the main thread may be asleep, especially when using UITableViewCellSelectionStyleNone 
2

Раствор в Swift 3

В SampleSelectorViewController (представленный контроллера зрения) использовать код, приведенный ниже

DispatchQueue.global(qos: .background).async { 

// Write your code 

} 
+0

Вам нужно отправить в свою основную очередь. Поэтому используйте: 'DispatchQueue.main.async {}' –

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