Как я могу задержать переходы UINavigationController в UIKit? - PullRequest
0 голосов
/ 21 февраля 2011

Ситуация: У меня есть два контроллера представления (UIViewController), которыми управляет контроллер навигации (UINavigationController).При загрузке первый контроллер представления, своего рода экран ожидания, инициирует загрузку второго контроллера представления, что занимает некоторое время.Как и сейчас, первый контроллер представления не переходит на второй контроллер представления, пока не будут загружены все данные - что, как я понимаю, является нормальным поведением в UIKit.

Проблема: Я хочу, чтобы первый контроллер вида (экран ожидания) отображался как минимум 2 секунды, пока он ожидает загрузки второго контроллера вида.Проблема заключается в том, что иногда загрузка второго контроллера представления завершается раньше, чем через 2 секунды, и 2-секундное ожидание прерывается.

Сон: Я хочу, чтобы переход от первого к второму контроллеру представления к ЗАДЕРЖАНИЮ, пока не прошло 2 секунды.

A) Сценарий сна A: Если загрузка второго контроллера представления заканчивается до 2-секундной задержки, я хочу, чтобы переход (анимация, которую вы на самом деле видите) откладывался до тех пор, пока не будет выполнена 2-секундная задержка.

B) Сценарий сна B: Если до завершения загрузки осталось 2 секунды, переход (анимация, которую вы на самом деле видите) должен произойти нормально, как только загрузка будет завершена.

Есть ли какие-либо обратные вызовы или уведомления в target-c или какао, которые могут мне это сделать?

Спасибо.

Обновление / уточнения: ( Извините, было не так ясно, как я мог бы )На первый взгляд может показаться, что NSTimer может быть моим решением.Ну, к сожалению это не так. Я знаю, как использовать NSTimer , чтобы подтолкнуть контроллер представления после задержки (не проблема).Я фактически нажимаю второй контроллер вида сразу, когда загружается первый контроллер вида.Идея состоит в том, что, поскольку загрузка второго контроллера представления занимает некоторое время, я предоставляю пользователю хороший экран ожидания с первым контроллером представления.

Причина отсутствия контроля :Могут быть случаи, когда загрузка второго контроллера вида заканчивается быстро, и в этом случае первый контроллер вида может быть виден только в течение доли секунды.Это выглядит непрофессионально.Поэтому вместо этого я хочу показывать экран ожидания в течение постоянного времени для согласованности и дать краткую полезную информацию о приложении.Мое приложение - это книга, а экран ожидания больше похож на фрагмент Frontis - с заголовком и автором.

Ответы [ 2 ]

2 голосов
/ 21 февраля 2011

Чтобы сделать вызов метода в будущем, я считаю, что наиболее удобный метод - это использовать executeSelector: withObject: afterDelay:

executeSelector: withObject: afterDelay: Вызывает метод получателяв текущем потоке с использованием режима по умолчанию после задержки.

  • (void) executeSelector: (SEL) aSelector withObject: (id) anArgument afterDelay: (NSTimeInterval) delay

Параметры aSelector Селектор, который определяет метод для вызова.Метод не должен иметь значимого возвращаемого значения и должен принимать один аргумент типа id или не иметь аргументов.См. «Селекторы» для описания типа SEL.anArgument Аргумент, передаваемый методу при его вызове.Передайте nil, если метод не принимает аргумент.задержка Минимальное время, до которого отправляется сообщение.Задание задержки 0 не обязательно приводит к немедленному выполнению селектора.Селектор все еще находится в очереди в цикле выполнения потока и выполняется как можно скорее.Обсуждение Этот метод устанавливает таймер для выполнения сообщения aSelector в цикле выполнения текущего потока.Таймер настроен для работы в режиме по умолчанию (NSDefaultRunLoopMode).Когда таймер срабатывает, поток пытается удалить сообщение из цикла выполнения и выполнить селектор.Это успешно, если цикл выполнения работает и в режиме по умолчанию;в противном случае таймер ожидает, пока цикл выполнения не перейдет в режим по умолчанию.

2 голосов
/ 21 февраля 2011

Первый способ работает, если нет проблем с многопоточностью:

    [NSThread sleepForTimeInterval:2.0];

Выбор второго способа предполагает, что вы реализуете простой селектор pushSomeViewControllerSelector, где происходит переход:

    [NSTimer scheduledTimerWithTimeInterval:2.0
                                     target:self
                                   selector:@selector(pushSomeViewControllerSelector)
                                   userInfo:nil
                                    repeats:NO];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...