2012-03-16 1 views
0

Приложение nilMy должно запускать несколько проверок, а затем может отображаться UIAlertView в любое время, когда мое приложение станет активным. Для этого я зарегистрировался на didBecomeActiveNotification и запустил свой чек здесь.UIAlertView вызывает предупреждение при запуске

Проблема возникает всякий раз, когда мой UIAlertView всплывает во время первоначального запуска, это приводит к тому, «Приложения должны иметь контроллер вида корень в конце запуска приложения» сообщения. Я предполагаю, что это происходит, потому что UIAlertView показан до viewDidAppear:.

Как я должен запускать свой UIAlertView, если нет в didBecomeActiveNotification?

2012-03-16 12:21:47.238 App[4181:707] viewDidLoad: 
2012-03-16 12:21:47.462 App[4181:707] didBecomeActiveNotification: 
2012-03-16 12:21:47.793 App[4181:707] Applications are expected to have a root view controller at the end of application launch 
2012-03-16 12:21:48.500 App[4181:707] viewDidAppear: 

Редактировать: Чтобы вызвать это в новом проекте, выполните следующие действия.

1 New Project -> Single View Application

2 В Viewcontroller.m добавить следующее viewDidLoad:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didBecomeActiveNotification:) name:UIApplicationDidBecomeActiveNotification object:nil]; 

3 В ViewController.m добавить следующий метод

-(void)didBecomeActiveNotification:(NSNotification *)notification 
{ 
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil message:nil delegate:self cancelButtonTitle:@"ok" otherButtonTitles: nil]; 
    [alertView show]; 
    [alertView release]; 
} 

4 Строительство и эксплуатация

+0

Как вы зарегистрировались на 'didBecomeActiveNotification'? –

+0

Внутри 'viewdidLoad', используя' [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector (didBecomeActiveNotification :) name: UIApplicationDidBecomeActiveNotification object: nil]; ' – trapper

+0

Я попытался показать предупреждение в app-delegate на' applicationDidBecomeActive' * и * в корневом представлении контроллера 'didBecomeActiveNotification', зарегистрированном с кодом, который вы указали, - оба работают. Как вы думаете, что-то особенное в вашем приложении, возможно, с инициализацией контроллера корневого представления? –

ответ

0

Как я уже сказал, никаких сообщений консоли, ни предупреждения компилятора. Можете ли вы подтвердить, что сообщение отображается только с указанным предупреждением, и нет такого сообщения без предупреждения?

enter image description here

+0

Да, это происходит только в том случае, если отображается предупреждение. Я вижу, что вы используете симулятор 5.1, и я на 5.0, хотя, возможно, это была какая-то ошибка, которая была исправлена ​​в 5.1? – trapper

+0

@trapper, вероятно, вы правы, я могу воспроизвести сообщение снова 5.0 'Simulator'. Но вот хорошая новость: ни одно сообщение не повторяет iOS 3.2 и 5.1 'devices'. После выходных я смогу снова проверить устройство 5.0. –

+0

Протестировано в 5.1-симуляторе, и у меня больше нет ошибки. – trapper

0

Как я должен запускать мой UIAlertView, если не в didBecomeActiveNotification?

Я бы вызвал его в контроллере корневого представления.

+0

Контроллер корневого представления не всегда находится в верхней части стека. –

+0

Я уже делаю все выше в rootViewController – trapper

0

Ваш AppDelegate не может запустить UIAlertViews. Это может быть сделано только ViewController.

У меня есть аналогичная вещь в одном из моих приложений, где я хочу что-то проверять, когда приложение запускается или становится активным, и представляет пользователю модальный viewController.

Что я сделал, чтобы создать новый класс, который имеет один метод:

+(BOOL)checkIfShouldShowAlert 

Вы можете затем вызвать этот метод в каждом из viewWillAppear методов ваших viewControllers', как так:

if ([myCheckerClass checkIfShouldShowAlert]) { 
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle... 
    [alertView show]; 
} 

Используя отдельный класс, ваш код намного проще обновлять в будущем!

+0

Я успешно создаю предупреждения в делететом 'applicationDidBecomeActive', вы, должно быть, ошибаетесь. Кроме того, если вы внимательно прочитаете вопрос, предупреждение будет создано в контроллере представления. –

+0

О! В этом случае уведомление «стало активным», вероятно, уже вызвано к тому времени, когда вид станет видимым, поэтому ваш viewController только устанавливает себя как получателя * после того, как * уведомление произошло. Я использую один NSUserDefault BOOL в своем приложении; Я установил его в YES до того, как приложение закроется, и NO при первом вызове viewController myCheckerClass – bryanjclark

+0

. Также: используете ли вы раскадровки или нет? Похоже, вы никогда не создаете RootViewController в своем AppDelegate. У вашего AppDelegate должен быть атрибут, называемый «окном»; убедитесь, что в applicationDidFinishLaunching вы создаете viewController и назначаете его атрибуту «Window» AppDelegate – bryanjclark

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

  • Нет связанных вопросов^_^