Добавление AlertView At viewWillAppear, iPhone

Я пытаюсь показать предупреждение, как только оно появится (без использования кнопки). В viewcontroller.m у меня есть:

- (void) viewWillAppear:(BOOL)animated
{
    UIAlertView *alert = [[UIAlertView alloc]
initWithTitle: @"User Information" message: @"Hello"
                              delegate: self cancelButtonTitle:nil otherButtonTitles: @"Continue", nil];

    [alert show];

    [alert release];
}

и в viewcontroller.h у меня есть:

IBOutlet UIView *alert; 

Я ничего не делал с моим файлом .xib.

При запуске симулятора я получаю в консоли следующее:

2009-11-30 23:41:36.079 BatteryApp[867:20b] *** Завершение приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «-[UIViewController _loadViewFromNibNamed:bundle:] загрузил nib «BatteryAppViewController», но выход представления не был установлен.

Любые идеи, где я пошел не так, что-то делать с моим xib?

Редактировать // Я подключаю оповещение к новому представлению в моем xib, но все равно не повезло


person Stumf    schedule 30.11.2009    source источник


Ответы (4)


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

  1. Код предупреждения должен быть в viewDidAppear, а не viewWillAppear

  2. Звоните [alert performSelector:@selector(show) withObject:nil afterDelay:0.0]. Это гарантирует, что предупреждение появится после завершения текущей анимации.

Возможно, вам придется быть осторожным с выпуском alert. На вашем месте я бы использовал отдельный метод (например, showHelloAlert), а затем вызывал бы его из viewDidAppear:

- (void)viewDidAppear: (BOOL)animated {
  [self performSelector:@selector(showHello) withObject:nil afterDelay:0.0f];
  [super viewDidAppear:animated];
}
person notnoop    schedule 01.12.2009
comment
Спасибо, ошибка исчезла, и отображается предупреждение... но 3 раза! Он отображается, а затем автоматически исчезает. Затем он снова появляется, но требует, чтобы вы отклонили его, прежде чем появиться снова! - person Stumf; 01.12.2009
comment
Я подозреваю, что вы вызываете viewDidAppear: явно несколько раз или что метод делегата вызывает showHello случайно. Вам нужно будет показать больше кода. - person notnoop; 01.12.2009

Попробуйте поместить предупреждение в viewDidAppear.

Кроме того, для чего нужен ioutlet? Попробуй все вынуть.

person ACBurk    schedule 30.11.2009

Откройте файл xib в Interface Builder и управляйте перетаскиванием от владельца файла (который должен быть класса BatteryAppViewController) к вашему представлению (не к предупреждению) и выберите представление из всплывающего меню. В журнале указано, что вы не выполнили подключение к этой розетке.

person Johan Kool    schedule 01.12.2009

Вы не подключаете UIAlerts в Interface Builder. Оповещения не имеют настраиваемых наконечников, поэтому вы не можете загрузить их в конструкторе интерфейсов. Вам необходимо удалить:

IBOutlet UIView *alert;

...полностью.

В сообщении об ошибке говорится, что у вас нет представления, определенного для вашего контроллера представления. Вам нужно настроить это в Interface Builder.

person TechZen    schedule 01.12.2009