代码之家  ›  专栏  ›  技术社区  ›  Ben Gottlieb

解除uiviewcontroller时调用的方法?

  •  5
  • Ben Gottlieb  · 技术社区  · 14 年前

    当当前视图控制器被解除(弹出或解除)时,是否有一种通用的最佳实践通知方式?我不能使用-viewwilldisappease:,因为当另一个viewcontroller被推到当前viewcontroller的顶部时,也会调用它。

    5 回复  |  直到 14 年前
        1
  •  11
  •   Jaka Jančar    14 年前
    - (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];
    }
    
        2
  •  0
  •   Chris Garrett    14 年前

    据我所知,没有自动的方法可以得到通知,但是由于uiviewcontroller有一个modal view controller属性,您可以定义一个like“diddismisse…”,并在呈现新的模式视图控制器之后,在上一个模式视图控制器上调用该方法。

        3
  •  0
  •   David van Dugteren    14 年前

    你能澄清你的问题吗?

    我想你是在问:

    viewcontrollero将弹出viewcontrollertwo modally。 ViewControllerTwo被解除。 viewcontrollero想知道viewcontrollertwo刚刚将自己解职了,因此想运行xyz方法。

    我没有很好的答案,但我有办法:

    VC1只是在VC2中引用。所以VC2可以在解雇前通知VC1。

        4
  •  0
  •   greg    9 年前

    使用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
    
        5
  •  0
  •   Michal Zaborowski    8 年前

    苹果改变了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)
    })
    

    我添加了observer is completionhandler,因为演示有时可能失败,特别是在已经演示viewcontroller时。

    在Observer值中,当ContainerView不再存在时,我必须删除Observation:

    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")
        }
    }