在NavigationController ios6中返回时调用方法

时间:2013-03-11 00:40:46

标签: ios6 delegates uinavigationcontroller back pushviewcontroller

我在NavigationController设置中有很多ViewControllers,并且想知道当用户点击“返回”时是否可以运行代码

基本上我的应用程序运行测试,我想“退回”也停止测试。我知道我可以添加一个单独的停止按钮,但这会更顺畅。

由于

编辑:

我已添加:

-(void) navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if ([[StdTCPTestViewController class] isSubclassOfClass:[ViewController class]])
        NSLog(@"We are going back to VC1");
}

到我的代码但是一旦视图加载就会调用它,而不是在按下后退按钮时调用。在下面的示例中,StdTCPTestViewController是VC2,ViewController是VC1。 NavController - VC1 - VC2是层次结构,segue从VC1推送到VC​​2。

还有其他调整吗?

1 个答案:

答案 0 :(得分:2)

假设您在导航控制器堆栈中有2个VC:

  • 堆栈顶部的VC2(即显示的前端VC)
  • VC1位于堆栈后面/下面的VC2(这是当你按下VC2时返回的VC)

每次将VC2“推”到导航控制器堆栈上时:调用VC2的viewDidLoad。每次“弹出”时,视图都会被卸载。另一方面,堆栈上的VC1不会调用它的viewDidload(当VC2弹出时),因为VC1仍然在内存中加载(记住你在VC1之上推VC2所以VC1必须留在内存中!)

所以在某种程度上,如果你想在按下后退按钮时执行一些代码,你应该把这些代码放在VC1的viewDidAppear(或viewWillAppear)方法中。

现在,如果您要编写的代码必须在弹出之前在VC2上执行,那么您可以在VC2中使用:

 -(void) navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
  if ([[viewController class] isSubclassOfClass:[VC1 class]])
  NSLog(@"We are going back to VC1");
}

这是一个UINavigationController委托方法,因此VC2必须通过在.h文件的@interface行末尾添加UINavigationControllerDelegate来采用该协议:

@interface VC2 : UIViewController <UINavigationControllerDelegate>

你必须将VC2设置为UINavigationController的委托,所以你必须放入VC2的viewDidLoad:

self.navigationController.delegate=self;

您显然还需要将VC1.h文件导入VC2,因为您在上面的委托方法代码中引用它。

希望这有帮助