В основном у меня есть view1 который в какой-то момент, view2 вызовов (через presentModalViewController:animated:
). Когда определенное UIButton
в view2 нажимается, view2 является вызовами метод уведомления в view1 и сразу позже отклонен. Метод уведомления открывается предупреждение.
Метод уведомления хорошо работает и назван соответственно. Проблема, каждый раз view1 создается (только один view1 должен существовать за один раз), я, по-видимому, получаю другого NSNotification
будучи созданным, потому что, если я иду от view0 (меню) к view1, затем обратно и дальше несколько раз, я получаю ряд того же аварийного сообщения, один за другим, из метода уведомления так много раз, как я открыл view1.
Вот мой код, скажите мне, что я делаю неправильно:
View1.m
-(void) viewDidLoad {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(showAlert:)
name:@"alert"
object:nil];
}
-(void) showAlert:(NSNotification*)notification {
// (I've also tried to swap the removeObserver method from dealloc
// to here, but it still fails to remove the observer.)
// < UIAlertView code to pop up a message here. >
}
-(void) dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
}
View2.m
-(IBAction) buttonWasTapped {
[[NSNotificationCenter defaultCenter] postNotificationName:@"alert"
object:nil];
[self dismissModalViewControllerAnimated:YES];
}
-(void) dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
}
Вызов -dealloc
не происходит автоматически после удаления контроллера представления - во времени жизни контроллера представления еще может оставаться некоторая "жизнь". В этот промежуток времени контроллер представления все еще подписан на это уведомление.
Если вы удалите наблюдателя в -viewWillDisappear:
или -viewDidDisappear:
, это будет иметь более немедленный эффект:
- (void) viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:@"alert"
object:nil];
}