如何识别导航堆栈中的先前视图控制器

Zhe*_*hen 78 objective-c uiviewcontroller uinavigationcontroller ios

我有两个单独的navigationcontrollers,一个与RootViewControllerA,另一个与RootViewControllerB.

我能够将ViewControllerC 推到A或B的导航堆栈上.

问题:当我在ViewControllerC中时,如何知道我是否在属于A或B的堆栈中?

jbu*_*s20 106

你可以使用UINavigationControllerviewControllers属性:

@property(nonatomic, copy) NSArray *viewControllers

讨论:根视图控制器位于数组中的索引0处,后视图控制器位于索引n-2处,顶部控制器位于索引n-1处,其中n是数组中的项目数.

https://developer.apple.com/documentation/uikit/uinavigationcontroller

您可以使用它来测试根视图控制器(数组索引0处的那个)是视图控制器A还是B.


Geo*_*rge 102

这是接受的答案的实施:

- (UIViewController *)backViewController
{
    NSInteger numberOfViewControllers = self.navigationController.viewControllers.count;

    if (numberOfViewControllers < 2)
        return nil;
    else
        return [self.navigationController.viewControllers objectAtIndex:numberOfViewControllers - 2];
}
Run Code Online (Sandbox Code Playgroud)

  • 我建议在`UIViewController`上添加它作为一个类别 (20认同)

Chr*_*ris 28

- (UIViewController *)backViewController
{
    NSInteger myIndex = [self.navigationController.viewControllers indexOfObject:self];

    if ( myIndex != 0 && myIndex != NSNotFound ) {
        return [self.navigationController.viewControllers objectAtIndex:myIndex-1];
    } else {
        return nil;
    }
}
Run Code Online (Sandbox Code Playgroud)


tjk*_*emz 11

接受答案的更一般的实现:

- (UIViewController *)backViewController {
    NSArray * stack = self.navigationController.viewControllers;

    for (int i=stack.count-1; i > 0; --i)
        if (stack[i] == self)
            return stack[i-1];

    return nil;
}
Run Code Online (Sandbox Code Playgroud)

无论当前类在导航堆栈中的位置如何,这都将返回正确的"后视图控制器".


gra*_*ito 9

swift实现tjklemz代码作为扩展:

extension UIViewController {

    func backViewController() -> UIViewController? {        
        if let stack = self.navigationController?.viewControllers {
            for(var i=stack.count-1;i>0;--i) {
                if(stack[i] == self) {
                    return stack[i-1]
                }
            }
        }
        return nil
    }
}
Run Code Online (Sandbox Code Playgroud)


Cin*_*316 9

这是Prabhu Beeman的 Swift代码的修改版本,它适应它以支持Swift 3:

extension UIViewController {
    func backViewController() -> UIViewController? {
        if let stack = self.navigationController?.viewControllers {
            for i in (1..<stack.count).reverse() {
                if(stack[i] == self) {
                    return stack[i-1]
                }
            }
        }
        return nil
    }
}
Run Code Online (Sandbox Code Playgroud)


Ada*_*hns 5

作为UINavigationController扩展:

extension UINavigationController {

    func previousViewController() -> UIViewController? {
        guard viewControllers.count > 1 else {
            return nil
        }
        return viewControllers[viewControllers.count - 2]
    }

}
Run Code Online (Sandbox Code Playgroud)