我需要知道当我看来控制器是得到出自一个星导航叠,所以我可以执行的行动。

我不能用-viewWillDisappear,因为这被称为当的图控制器被移动的屏幕由于任何原因(如新视图控制器被推上)。

我特别需要知道当的控制器即将出现的本身。

任何想法,将是可怕的,在此先感谢。

有帮助吗?

解决方案

我不认为有这个明确的消息,但你可以子类的UINavigationController和覆盖 - popViewControllerAnimated(虽然我还没有自己尝试过这一点)

另外,如果有到视图控制器的任何其他引用,你能不能添加到其 - 的dealloc

其他提示

覆盖在所呈现的VC的viewWillDisappear方法,接着检查重写内isMovingFromParentViewController标志并做具体的逻辑。就我而言,我躲在导航控制器工具栏。仍需要您呈现VC明白,它被推倒,但这样并不完美。

试试重写 willMoveToParentViewController: (而不是的 viewWillDisappear:)在您的定义类的 UIViewController.

所谓的前景控制器添加或删除一个容器图控制器。

- (void)willMoveToParentViewController:(UIViewController *)parent
{
    [super willMoveToParentViewController:parent];
    if (!parent) {
        // `self` is about to get popped.
    }
}

幸运的是,在viewWillDisappear方法被调用时,的viewController已经从堆栈中移除,所以我们知道的viewController被弹出,因为它是在 self.navigationController.viewControllers <不再/ p>

<强>夫特4

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    if let nav = self.navigationController {
        let isPopping = !nav.viewControllers.contains(self)
        if isPopping {
            // popping off nav
        } else {
            // on nav, not popping off (pushing past, being presented over, etc.)
        }
    } else {
        // not on nav at all
    }
}

<强>原始代码

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    if ((self.navigationController) && 
        (![self.navigationController.viewControllers containsObject:self])) {
        NSLog(@"I've been popped!");
    }
}

这是为我工作。

- (void)viewDidDisappear:(BOOL)animated
{
    if (self.parentViewController == nil) {
        NSLog(@"viewDidDisappear doesn't have parent so it's been popped");
        //release stuff here
    } else {
        NSLog(@"PersonViewController view just hidden");
    }
}

您可以在这里抓住它。

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {

    if (viewController == YourAboutToAppearController) {
            // do something
    }
}

这将只在新视图的显示之前进行发射。没有人还没有移动。我用所有的时间做魔术的愚蠢NavigationController的前面。您可以设置标题和按钮标题和为所欲为那里。

我有同样的问题。我试着用viewDisDisappear,但我不具备的功能得到所谓:((不知道为什么,也许是因为我所有的VC是的UITableViewController)。 亚历克斯的建议,工作正常,但如果您的导航控制器的更多选项卡下显示失败。在这种情况下,你的导航控制器的所有VC都为UIMoreNavigationController,而不是导航控制器你有子类的navigationController,这样你就不会被当VC即将杀出的导航通知。结果 Finaly,我解决了这个问题用的UINavigationController的类别,只重写 - (的UIViewController *)popViewControllerAnimated:(BOOL)动画

- (UIViewController *)popViewControllerAnimated:(BOOL)animated{
   NSLog(@"UINavigationController(Magic)");
   UIViewController *vc = self.topViewController;
   if ([vc respondsToSelector:@selector(viewControllerWillBePopped)]) {
      [vc performSelector:@selector(viewControllerWillBePopped)];
   }
   NSArray *vcs = self.viewControllers;
   UIViewController *vcc = [vcs objectAtIndex:[vcs count] - 2];
   [self popToViewController:vcc animated:YES];
   return vcc;}

这很适合我:d

我尝试这样:

- (void) viewWillDisappear:(BOOL)animated {
    // If we are disappearing because we were removed from navigation stack
    if (self.navigationController == nil) {
        // YOUR CODE HERE
    }

    [super viewWillDisappear:animated];
}

的想法是,在弹出时,视图控制器的navigationController被设置为零。 因此,如果观点是消失,它不再有一个navigationController,我断定它弹出。 (可能在其他情况下工作)。

无法担保该viewWillDisappear将在弹出被调用,因为它不是在文档中提到。我尝试了当视图是俯视图,下面顶视图 - 和它在这两个工作

好运, 奥德。

可以使用这一个:

if(self.isMovingToParentViewController)
{
    NSLog(@"Pushed");
}
else
{
    NSLog(@"Popped");
}

子类UINavigationController和倍率popViewController

夫特3

protocol CanPreventPopProtocol {
    func shouldBePopped() -> Bool
}

class MyNavigationController: UINavigationController {
    override func popViewController(animated: Bool) -> UIViewController? {
        let viewController = self.topViewController

        if let canPreventPop = viewController as? CanPreventPopProtocol {
            if !canPreventPop.shouldBePopped() {
                return nil
            }
        }
        return super.popViewController(animated: animated)
    }

    //important to prevent UI thread from freezing
    //
    //if popViewController is called by gesture recognizer and prevented by returning nil
    //UI will freeze after calling super.popViewController
    //so that, in order to solve the problem we should not return nil from popViewController
    //we interrupt the call made by gesture recognizer to popViewController through
    //returning false on gestureRecognizerShouldBegin
    //
    //tested on iOS 9.3.2 not others
    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        let viewController = self.topViewController

        if let canPreventPop = viewController as? CanPreventPopProtocol {
            if !canPreventPop.shouldBePopped() {
                return false
            }
        }

        return true
    }

}

也许可以使用UINavigationBarDelegate的的导航栏:shouldPopItem协议方法

尝试使该检查在viewwilldisappear 如果([self.navigationController.viewControllers indexOfObject:自] == NSNotFound){ //这个观点已经爆裂happend。 }

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top