Метод вызывается при закрытии UIViewController? - PullRequest
5 голосов
/ 15 марта 2010

Существует ли общий способ получения уведомлений, когда текущий контроллер представления увольняется (либо выскочил, либо dismissModalDialog'd)? Я не могу использовать -viewWillDisappear:, так как он также вызывается, когда другой viewController помещается поверх текущего.

Ответы [ 5 ]

11 голосов
/ 26 апреля 2010
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
        [self addObserver:self forKeyPath:@"parentViewController" options:0 context:NULL];
    }
    return self;
}


- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if ([@"parentViewController" isEqualToString:keyPath] && object == self) {
        if (!self.parentViewController)
            NSLog(@"Dismissed");
    }
}

- (void)dealloc
{
    [self removeObserver:self forKeyPath:@"parentViewController"];
    [super dealloc];
}
0 голосов
/ 17 августа 2016

Apple изменила, как презентация работает в iOS8, они используют презентационные контроллеры, потому что презентационные контроллеры не являются KVO-совместимыми, мне пришлось использовать containerView, потому что это removedFromSuperview и обнуляется при вызове -[UIPresentationController transitionDidFinish:]. Решение для iOS8 и выше:

self.presentationContext.presentViewController(self.viewControllerToPresent, animated: true, completion: { _ in
     self.viewControllerToPresent.presentationController?.addObserver(self, forKeyPath: "containerView", options: [], context: &self.observingContext)
})

Я добавляю, что наблюдатель - завершение, потому что иногда презентация может завершиться неудачей, особенно при представлении уже представленного viewController.

В значении наблюдателя я должен удалить наблюдение, когда containerView больше не существует:

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
    guard &self.observingContext == context else {
        super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context)
        return
    }
    if let presentationController = object as? UIPresentationController where presentationController.containerView == nil {
        presentationController.removeObserver(self, forKeyPath: "containerView")
    }
}
0 голосов
/ 26 июля 2015

Выбранный ответ с помощью KVO у меня не работал на iOS 8.

Я подклассифицировал UIViewController следующим образом, а затем просто вызываю dismissAnimated:completion: на представленном контроллере представления вместо dismissViewControllerAnimated:completion:. Я регистрируюсь для наблюдения за уведомлением в другом месте и запускаю обработку по мере необходимости.

#define DismissNotifyViewControllerDismissedNotification  @"DismissNotifyViewControllerDismissed"


@interface DismissNotifyViewController : UIViewController

- (void)dismissAnimated:(BOOL)flag completion:(void (^)(void))completion;

@end


@implementation DismissNotifyViewController

- (void)dismissAnimated:(BOOL)flag completion:(void (^)(void))completion
{
    [self.presentingViewController dismissViewControllerAnimated: flag
                                                      completion: ^{

          if (completion)
               completion();

          [NSNotificationCenter.defaultCenter 
                     postNotificationName: DismissNotifyViewControllerDismissedNotification
                     object: self];
    }];
}

@end
0 голосов
/ 05 мая 2010

Можете ли вы уточнить вопрос?

Я думаю, что вы спрашиваете:

ViewcontrollerONE выскакивает ViewControllerTWO модально. ViewControllerTWO уволен. ViewControllerONE хочет знать, что That ViewControllerTWO только что закрылся и из-за этого хочет запустить метод XYZ.

У меня нет хорошего ответа, но у меня есть способ:

VC1 просто упоминается в VC2. поэтому VC2 может уведомить VC1 перед увольнением.

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

Насколько я знаю, нет автоматического способа получения уведомлений, но, поскольку UIViewController имеет свойство modalViewController, вы можете определить как "didDismiss ..." и вызвать этот метод в предыдущем контроллере модального представления после представления нового контроллер модального вида.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...