iPhone: диалоговое окно UIAlert появляется 3 раза для каждого звонка - PullRequest
0 голосов
/ 15 марта 2010

У меня есть 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 контроллере представления.

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

Ответы [ 3 ]

1 голос
/ 15 марта 2010

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

0 голосов
/ 02 июля 2010

Было бы полезно увидеть код вокруг оповещения.

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

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

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

0 голосов
/ 15 марта 2010

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

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

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

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

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

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

Edit01:

См. Этот пост с такой же проблемой: UIAlertView выскакивает три раза за вызов вместо одного раза

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

...