弹出查看控制器
Posted
技术标签:
【中文标题】弹出查看控制器【英文标题】:pop To View Controller 【发布时间】:2014-05-23 21:34:06 【问题描述】:我是 Objective-C 编码的新手,我正在尝试使用 pop to viewController
。要在点击按钮时执行此操作,我使用
[self.navigationController popToViewController:(what goes here) animated:YES];
我知道它是一个UIViewController*
,但我想知道我在哪里声明它以及我将使用什么代码来声明它。
我的基本情节提要是我有 4 个视图控制器 A、B、C、D,A 是根,它被推到 B,它被推到 C,C 被推到 D,我的按钮在 D 上,我正试图弹回B. index 方法中的对象不起作用,因为它并不总是去A->B->C->D
,有时它会去A->C->B->D
所以
[self.navigationController popToViewController: [self.navigationController.viewControllers objectAtIndex:2] animated:YES];
所以这行不通。
提前感谢您的帮助。抱歉,这个问题太简单了。
【问题讨论】:
您的问题是关于推送、弹出或如何制作视图控制器? 如果视图控制器 B 在导航堆栈中,则 popToViewController 是正确的方法。您需要保留对视图控制器 B 的引用,例如作为应用程序委托的属性,或者您可以遍历导航控制器 viewcontrollerwithrestorationidentifier 数组来识别您需要的引用 - 可能使用 isMemberOf 类方法 如果你有故事板,你根本不应该打电话给pushViewController
。你应该使用 push segue。
@MJN 对那个错字感到抱歉,我该如何将它作为属性保存在应用程序委托中?如何保存它的参考?谢谢
如果您打错字,请更新您的问题。
【参考方案1】:
您需要一种方法来找到要弹出的视图控制器。
-(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];
【讨论】:
嘿,当我在按钮按下方法中使用它时,我收到此错误“由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'试图弹出到不存在的视图控制器。' " 抱歉打错了 每次发生这种情况时所需的 VC 是否为零?如果是这样,您需要将 pop 方法包装在 if 语句中,该语句仅在desiredVC
存在时触发。
如果我在按下按钮时注销用户然后重新登录可能会影响堆栈,我仍然会收到错误消息,我认为这是因为视图已加载? 【参考方案2】:
我个人认为这不是一个基本问题,即使我在这种情况下感到震惊。但是我通过使用“中介者设计模式”找到了一个很好的解决方案,并通过结合该方法将我的自定义 UINavigationController 开发为协调器:
- (void)setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated
并维护我自己的导航堆栈。
如果您的导航方式不可预测,协调器(您的自定义 UINavigationController)必须控制您的导航。
【讨论】:
以上是关于弹出查看控制器的主要内容,如果未能解决你的问题,请参考以下文章