iPhone:Диалоговое окно UIAlert Появляется 3 раза для каждого вызова

StackOverflow https://stackoverflow.com/questions/2445832

Вопрос

У меня есть UIAlert, который появляется 3 раза при каждом его вызове.Он появляется, а затем исчезает, прежде чем я успеваю нажать на него.Может ли быть так, что viewDidLoad сам вызывается 3 раза?

Я внедрил UIAlert в viewDidLoad моего приложения:

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:alertMessage  delegate:self cancelButtonTitle:ok otherButtonTitles:nil];

Это и есть тот самый viewDidLoad в RootViewController, который управляет представлениями:

- (void)viewDidLoad {
    Kundenkarte *kartenAnsicht = [[Kundenkarte alloc]
                                                initWithNibName:@"Kundenkarte" bundle:nil];
    kartenAnsicht.rootViewController = self;
    kartenAnsicht.viewDidLoad;
    self.map = kartenAnsicht;


    [self.view addSubview:kartenAnsicht.view];


    [kartenAnsicht release];
//  [super viewDidLoad];

}

В viewDidLoad это вызывает UIAlert в kartenAnsicht просмотр контроллера.

Я надеюсь, что кто-нибудь сможет мне помочь, потому что у меня закончились идеи.

Это было полезно?

Решение

Прежде всего, вы никогда не должны помещать какой-либо тип дисплея в viewDidLoad.Этот метод предназначен для настройки за кулисами после первого считывания представления из nib.Нет уверенности в том, что он будет вызываться каждый раз при отображении представления, потому что после первой загрузки представление, возможно, хранится в памяти и не перезагружается из nib.

Вместо этого поместите вызов для вызова NSAlert в viewWillDisplay или viewDidDisplay.Это будет отображать предупреждение каждый раз, когда появляется представление.

Я сомневаюсь в этом viewDidLoad вызывается три раза, но чтобы проверить это, просто поместите NSLog в метод, чтобы увидеть, сколько раз он вызывался.

Когда ты говоришь, что:

я внедрил NSAlert в viewDidLoad() моего приложения:

...что это значит?У какого именно объекта есть метод?Если это делегат приложения, это не сработает, поскольку протокол делегирования приложения не отвечает на viewDidLoad.Это должно быть в UIViewController .

Редактировать 01:

Смотрите этот пост, в котором была такая же проблема: UIAlertView Появляется три раза за вызов, а не Только один раз

Короткий ответ:Вы отключаете оповещение, отпуская его.Либо сохраните его как свойство контроллера представления, либо, что еще лучше, отобразите оповещение с помощью runModal вместо того , чтобы show и немедленно зафиксируйте возвращенный номер кнопки.

Другие советы

Тебе не нужно звонить -viewDidLoad самостоятельно, он запускается автоматически механизмом загрузки наконечника.Это означает, что вы получаете дополнительные вызовы -viewDidLoad:один по дизайну и дополнительные, когда вы его назовете.

Было бы полезно просмотреть код вокруг вызова alert.

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

if (!myAlert) { /* set up and show myAlert */ }

Однако одна из проблем заключается в том, что когда вы нажимаете кнопку Отмены, оповещение останется ненулевым и, следовательно, никогда не сможет отображаться снова из-за этого условия.Если бы кто-нибудь мог добавить к этому ответу исправление для этого, это было бы здорово.Я предполагаю, что могу добавить обработчик для кнопки отмены, который уничтожит myAlert.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top