在NavigationController ios6中返回时调用方法

在NavigationController ios6中返回时调用方法,ios6,delegates,uinavigationcontroller,back,pushviewcontroller,Ios6,Delegates,Uinavigationcontroller,Back,Pushviewcontroller,在NavigationController设置中有许多ViewController,我想知道当用户单击“后退”时是否可以运行代码 基本上,我的应用程序运行一个测试,我想“返回”也停止测试。我知道我可以添加一个单独的停止按钮,但这会更平滑 谢谢 编辑: 我补充说: -(void) navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *

在NavigationController设置中有许多ViewController,我想知道当用户单击“后退”时是否可以运行代码

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

谢谢

编辑:

我补充说:

-(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是层次结构,序列从VC1推送到VC2


还有其他的调整吗

假设导航控制器堆栈中有2个VCs:

  • 堆栈顶部的VC2(即显示的前VC)
  • 堆栈上VC2后面/下面的VC1(即当按下VC2上的back键时,您将返回到的back VC)
每次将VC2“推”到导航控制器堆栈上时:调用VC2的viewDidLoad。每次它被“弹出”,视图就被卸载。另一方面,堆栈上的VC1不会调用其viewDidload(当VC2弹出时),因为VC1仍然加载在内存中(请记住,您将VC2推到了VC1的顶部,所以VC1必须留在内存中!)

因此,在某种程度上,如果您希望在按下后退按钮时执行某些代码,则应将该代码放入VC1的ViewDidDisplay(或ViewWillDisplay)方法中

现在,如果要编写的代码在弹出之前必须在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>
显然,您还需要将VC1.h文件导入VC2,因为您在上面的委托方法代码中引用了它


希望这有帮助

请参见下面的更新答案我对我的上一条评论做了一些编辑,请参见下面的感谢@Spectravideo328的详细回复,我很快就会尝试!我已经添加了您要求的所有代码,现在我有一个问题,即在加载视图时调用代码,而不是在我按下后退按钮时调用代码。我有:-(无效)导航控制器:(UINavigationController*)导航控制器将显示视图控制器:(UIViewController*)视图控制器动画:(BOOL)动画{if([[StdTCPTestViewController类]isSubclassOfClass:[viewController类]])TcpSpeedTestDelete(TestHandle);TestHandle=Nil;[Timer invalidate];NSLog(@“我们将返回VC1”);}是StdTCPTestViewController VC2(前/上VC)还是VC1(后VC)?@DanJamesPalmer,将其更改为:if([[viewController类]isSubclassOfClass:[VC1类]])。这里,viewController指的是在方法名称中传递的VC实例,VC1应该是VC1类的名称,而不是VC2。换句话说,这意味着:如果导航控制器告诉我们将出现的VC属于VC1类,那么请执行。。。。。。因此,保持我的代码不变,只将VC1更改为您的VC1类名。因此,它应该是“如果VC2类是VC1类的子类:?如果是,那么这就是我的方法。我的程序中的VC2是StdTCPTestViewController,VC1是ViewController,请参阅我的操作编辑。是否正确>
self.navigationController.delegate=self;