Важно также отметить, что viewWillDisappear
вызывается также, когда контроллер представления представляет новый UIView. Этот делегат просто указывает, что основной вид контроллера представления не виден на дисплее.
В этом случае освобождение уведомления в viewWillDisappear
может быть неудобным, если мы используем уведомление, чтобы позволить UIview связываться с родительским контроллером представления.
В качестве решения я обычно удаляю наблюдателя одним из следующих двух способов:
- (void)viewWillDisappear:(BOOL)animated {
NSLog(@"viewController will disappear");
if ([self isBeingDismissed]) {
NSLog(@"viewController is being dismissed");
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"actionCompleted" object:nil];
}
}
-(void)dealloc {
NSLog(@"viewController is being deallocated");
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"actionCompleted" object:nil];
}
По тем же причинам, когда я выдаю уведомление в первый раз, мне нужно учитывать тот факт, что в любое время, когда представление с надстройкой появляется над контроллером, тогда запускается метод viewWillAppear
. Это, в свою очередь, создаст несколько копий одного и того же уведомления. Поскольку нет способа проверить, активно ли уже уведомление, я устраняю проблему, удаляя уведомление перед его добавлением:
- (void)viewWillAppear:(BOOL)animated {
NSLog(@"viewController will appear");
// Add observers
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"imageGenerated" object:nil]; // This is added to avoid duplicate notifications when the view is presented again
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedImageFromCameraOrPhotolibraryMethodOnListener:) name:@"actionCompleted" object:nil];
}