iPhone:Диалоговое окно UIAlert Появляется 3 раза для каждого вызова
-
20-09-2019 - |
Вопрос
У меня есть 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.