Ios 弹出视图控制器

Ios 弹出视图控制器,ios,objective-c,uinavigationcontroller,pushviewcontroller,poptoviewcontroller,Ios,Objective C,Uinavigationcontroller,Pushviewcontroller,Poptoviewcontroller,我不熟悉objective-C编码,正在尝试使用pop来viewController。要在点击按钮时执行此操作,我使用 [self.navigationController popToViewController:(what goes here) animated:YES]; 我知道它是一个UIViewController*,但是我想知道我在哪里声明它,以及我将使用什么代码来声明它 我的基本故事板是我有4个视图控制器A,B,C,D,A是根,它推到B,它推到C,它推到D,我的按钮在D上,我试图弹

我不熟悉objective-C编码,正在尝试使用pop来
viewController
。要在点击按钮时执行此操作,我使用

[self.navigationController popToViewController:(what goes here) animated:YES];
我知道它是一个
UIViewController*
,但是我想知道我在哪里声明它,以及我将使用什么代码来声明它

我的基本故事板是我有4个视图控制器A,B,C,D,A是根,它推到B,它推到C,它推到D,我的按钮在D上,我试图弹回到B。索引方法的对象不工作,因为它不总是去
A->B->C->D
有时它去
A->C->B->D
所以

[self.navigationController popToViewController: [self.navigationController.viewControllers objectAtIndex:2] animated:YES];
所以这不起作用


提前谢谢你的帮助。如果这个问题太基本,很抱歉。

您需要一种方法来找到要弹出到的视图控制器

-(IBAction)popToDesiredViewController:(id)sender
{
    UIViewController *desiredVC = nil;

    // LOOK AT ALL VIEW CONTROLLERS IN NAVIGATION CONTROLLER
    for (UIViewController *oneVC in self.navigationController.viewControllers) {

        // CHECK IF THIS IS THE VIEW CONTROLLER YOU WANT
        // change this to your logic
        BOOL foundDesiredVC = [oneVC isKindOfClass: [SignInVC class]]; 

        if (foundDesiredVC) {
            desiredVC = oneVC;
            break;
        }
    }

    [self.navigationController popToViewController:desiredVC animated:YES];
}

就我个人而言,我并不认为这是一个基本问题,即使在这种情况下我也会被打动。但我通过使用“Mediator设计模式”找到了一个很好的解决方案,并结合以下方法开发了我的自定义UINavigationController作为协调器:

- (void)setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated
以及维护我自己的导航堆栈


如果您的导航方式不可预测,协调器(您的自定义UINavigationController)必须控制您的导航

您的问题是关于推、弹出或如何制作视图控制器?如果视图控制器B位于导航堆栈中,则popToViewController是正确的方法。您需要保留对视图控制器B的引用,例如作为应用程序委托的属性,或者您可以使用RestorationIdentifier数组遍历导航控制器viewcontrollerwithrestorationidentifier来标识所需的引用-如果您有情节提要,可以使用isMemberOf类方法,您根本不应该调用
pushViewController
。您应该使用推送序列。@MJN这是关于弹出对不起,关于这个输入错误,我该如何将它作为属性保存在应用程序委托中?如何保存它的引用?谢谢如果您输入了一个错误,请更新您的问题。嘿,当我在按下按钮的方法中使用这个错误时,我得到了这个错误“由于未捕获的异常而终止应用程序'nsinternalinconsistenceexception',原因:'试图弹出到一个不存在的视图控制器。'”并且,对于输入错误,很抱歉每次发生这种情况时所需的VC为零吗?如果是这样,您将希望将pop方法包装在一个If语句中,该语句仅在
desiredVC
存在时触发。如果我在按下按钮时注销用户,然后将其重新登录,则仍然会出现错误,这可能会影响堆栈,我认为这是因为视图已加载??