1

我在 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 是层次结构,segue 是从 VC1 推送到 VC2。

还有其他微调吗?

4

1 回答 1

2

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

  • 堆栈顶部的 VC2(即显示的最前面的 VC)
  • 堆栈上的 VC1 在 VC2 后面/下面(即当您按回 VC2 时将返回到的后面的 VC)

每次 VC2 被“推送”到导航控制器堆栈时:调用 VC2 的 viewDidLoad。每次“弹出”时,视图都会被卸载。另一方面,堆栈上的 VC1 不会调用它的 viewDidload(当 VC2 被弹出时),因为 VC1 仍然加载在内存中(请记住,您将 VC2 推到 VC1 之上,因此 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,因为您在上面的委托方法代码中引用了它。

希望这可以帮助

于 2013-03-11T01:59:38.697 回答