【问题标题】:Call a method upon going back within a NavigationController ios6在 NavigationController ios6 中返回时调用方法
【发布时间】:2013-03-11 00:40:45
【问题描述】:

我在 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。

还有其他调整吗?

【问题讨论】:

  • 请参阅下面的更新答案
  • 我对上一条评论进行了一些修改,请参见下文

标签: ios6 delegates uinavigationcontroller back pushviewcontroller


【解决方案1】:

假设您在导航控制器堆栈中有 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,因为您在上面的委托方法代码中引用了它。

希望对你有帮助

【讨论】:

  • 感谢@Spectravideo328 的详细回复,我会尽快尝试!
  • 我已经添加了您所询问的所有代码,现在我遇到了一个问题,即在视图加载时调用代码,而不是在我按下后退按钮时。我有:-(void) navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { if ([[StdTCPTestViewController class] isSubclassOfClass:[ViewController class]]) TcpSpeedTestDelete(TestHandle);测试句柄 = 无; [定时器无效]; NSLog(@"我们要回到 VC1"); }
  • 是StdTCPTestViewController VC2(前/顶VC)还是VC1(后VC)?
  • @DanJamesPalmer,将其更改为:if ([[viewController class] isSubclassOfClass:[VC1 class]])。这里 viewController 是指传入方法名的 VC 实例,VC1 应该是你的 VC1 类的名称,而不是 VC2。换句话说,这就是说:如果导航控制器告诉我们将出现的 VC 属于 VC1 类,那么就这样做……所以保持我的代码不变,只需将 VC1 更改为您的 VC1 类名。
  • 所以它应该是“如果 VC2 类是 VC1 类的子类:?如果是这样,那我就是这样。我的程序中的 VC2 是 StdTCPTestViewController 而 VC1 是 ViewController,请参阅我的 OP 编辑​​。是正确的>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-05
  • 1970-01-01
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多