romaonthego / REFrostedViewController

iOS 7/8 style blurred view controller that appears on top of your view controller.
MIT License
2.97k stars 494 forks source link

self.frostedViewController sometime return nil #92

Open luhui opened 10 years ago

luhui commented 10 years ago

I use self.frostedViewController in my menuViewController in viewDidLoad method. But sometimes return is nil and the UIButton in my menuViewController can not touch, only when i close the menuViewController and reopen it. I found that the containerViewController called viewDidload before it added to be the frostedViewController's childViewController I fix the return nil problem with the code:

- (REFrostedViewController *)frostedViewController  
{  
    UIViewController *iter = self.parentViewController;
    while (iter) {
        if ([iter isKindOfClass:[REFrostedViewController class]]) {
            return (REFrostedViewController *)iter;
        } else if (iter.parentViewController && iter.parentViewController != iter) {
            iter = iter.parentViewController;
        } else if ([iter isKindOfClass:[REFrostedContainerViewController class]]) {
            return iter.frostedViewController;
        }else {
            iter = nil;
        }
    }
    return nil;
}

But I don't know how to fix the problem UIButton in the menuViewController can not response the touch gesture at first time.

luhui commented 10 years ago

Onece I solved the problem use the code above, it gets nil also when I set contentView twice before menuViewController present. I found that setContentView method in REFrostedViewController, it will reset the contentView's frame with containerView's frame. The code below:

- (void)setContentViewController:(UIViewController *)contentViewController
{
    if (!_contentViewController) {
        _contentViewController = contentViewController;
        return;
    }

    [_contentViewController removeFromParentViewController];
    [_contentViewController.view removeFromSuperview];

    if (contentViewController) {
        [self addChildViewController:contentViewController];
        contentViewController.view.frame = self.containerViewController.view.frame;// what's this code work?
        [self.view insertSubview:contentViewController.view atIndex:0];
        [contentViewController didMoveToParentViewController:self];
    }
    _contentViewController = contentViewController;

    if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) {
        [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
    }
}

Once I delete contentViewController.view.frame = self.containerViewController.view.frame;, it works well for me.