#iphone #objective-c #ios
#iPhone #objective-c #iOS
Вопрос:
У меня в приложении есть процесс загрузки данных, который инициируется нажатием кнопки. Операция выполняется в фоновом потоке, поэтому пользователь может свободно переходить к другим представлениям и делать то, что ему нравится.
Когда загрузка завершится, пользователю будет показано предупреждение о том, что приложение необходимо перезагрузить. При нажатии OK запускается метод AlertView clickedButtonAtIndex. Внутри этого метода я вызываю popToRootViewControllerAnimated.
Если я не перешел к другим представлениям и остался в представлении, с которого пользователь инициировал загрузку, это работает!! Проблема в том, что если пользователь отошел от просмотра, инициированного загрузкой, и нажимает OK в предупреждении «перезагрузить приложение», ничего не происходит. Пользователь не перенаправляется обратно на корневой контроллер просмотра. Он просто остается на месте…
Кто-нибудь может помочь? Я неправильно подхожу к этому? Мне нужен процесс, который либо перезапускает приложение, либо возвращается к моему корневому контроллеру просмотра, независимо от того, куда пользователь перешел после нажатия кнопки загрузки.
В худшем случае я просто выключу приложение и сообщу пользователю, что им необходимо перезапустить, чтобы применить обновления. Я бы предпочел держаться подальше от этого и позволить пользователю оставаться в приложении.
Спасибо за вашу помощь.
Обновить:
Вот запрошенный код:
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
if (buttonIndex != 0) {
//User indicated that they want to restart the app so that they can apply the update
cameFrom = CAME_FROM_RESTART;
[self.navigationController popToRootViewControllerAnimated:NO];
}
Комментарии:
1. Все ли помещено под один навигационный контроллер? Корневой контроллер просмотра в любом случае является относительным к текущему.
2. Пожалуйста, опубликуйте код, в котором вы возвращаетесь к корню. Я подозреваю, что навигационный контроллер, который вы пытаетесь подключить к pop, равен нулю в контексте, в котором вы на него ссылаетесь.
3. Извините за двойной пост. Я обновил этот пост кодом.
4. Какой контроллер использует собственный
alertView:clickedButtonAtIndex:
метод? Если тот, который инициирует загрузку, то он, возможно, был выпущен к моменту завершения загрузки, если пользователь перешел к какому-либо из верхних (в стеке навигации) контроллеров.5. Да, это тот, который инициирует dload. Я проверил в отладчике, что код действительно выполняется. Будет ли он по-прежнему выполняться, если он был выпущен … но просто не обновит представление? Я новичок в iOS, поэтому, пожалуйста, отнеситесь ко мне терпеливо.
Ответ №1:
Вы можете использовать setViewController:animated: вместо popToRootViewControllerAnimated. Когда последний у меня не сработал, я использую setViewController: animated: и работает. В последний раз, когда я использовал setViewController с анимированным ДА, он выдает ошибку. пересылка. Если это случится с вами, попробуйте с анимированным: НЕТ
Ответ №2:
Вы также можете попробовать настроить отправку уведомления делегату вашего одноэлементного приложения, которое вызывается при завершении загрузки, или при нажатии кнопки ok, или что-то еще. Затем в этом обратном вызове вы можете перезагрузить любой контроллер просмотра, который вы хотите.
Комментарии:
1. Я немного новичок в iOS. Не могли бы вы описать, как это можно сделать? Есть ли что-то в моем объекте оповещения, что мне нужно указать, что указывает ему перенаправлять обратный вызов моему делегату приложения?