【问题标题】:Popping ViewControllers when using delegation使用委托时弹出 ViewController
【发布时间】:2012-12-27 05:56:43
【问题描述】:

我承认我的 Objective C 有点弱,我的最终目标是将数据从 ViewController3 传递回 ViewController1。实际上,这部分已经完成并且成功了。然而,当调用 [self.navigationController popToRootViewControllerAnimated:YES] 我得到 EXC_BAD_ACCESS。

ViewController1 <ViewController2Delegate>
- (void) didAddEventLocation:(Event *)event {
    NSLog(@"Event name = %@", event.name); //Shows name successfully
}

ViewController2 <ViewController3Delegate>
- (void) didAddEvent:(Event *)event {
   [self.delegate didAddEventLocation:event];
}

ViewController3
[self.delegate didAddEvent:event];
[self.navigationController popToRootViewControllerAnimated:YES];

抱歉,代码格式不正确,只是为了简化。做 [self.navigationController popViewControllerAnimated:YES] 没有问题,但它只需要我到 ViewController2。我知道我在这里做错了什么,但不能完全确定如何解决它。如果我需要澄清,请告诉我。

【问题讨论】:

  • 你确定[self.delegate didAddEventLocation:eventTmp];是正确的,因为参数是event
  • 是的,抱歉.. 是我在复制/粘贴代码时打错了字。立即编辑。

标签: ios objective-c inheritance delegation


【解决方案1】:

使用僵尸追捕给你 EXC_BAD_ACCESS 的东西。一些对象已被释放,现在在您弹回根视图控制器时被调用。

试试这个链接: How do I set up NSZombieEnabled in Xcode 4?

【讨论】:

  • @xhermit 是的,这必须解决你的问题。你会看到哪个对象被释放了。
  • 谢谢。我以前用过 Instruments 来追捕僵尸,我想我忘了我应该在堆栈跟踪中寻找 Event Type = Zombie。我将其归结为在弹出导航堆栈之前未调用 [self.locationManager stopUpdatingLocation] 的问题。再次感谢!
【解决方案2】:

看起来,您的一个控制器(在我看来是第一个)已被释放。在 VC3 方法中检查 self.navigationController 是否存在。然后你必须检查他所有的风险投资。我觉得没啥先拿VC的。问题可以通过使用(例如)导航控制器的 addChildViewController 方法来解决,或者如果 smth 将引用您的控制器。

此外,如果您对它们之间的路径有疑问,您可以使用 NSNotificationCenter 将一些信息从一个实例发送到另一个实例。

HTH!

【讨论】:

  • [self.navigationController.viewControllers objectAtIndex:x] 显示了视图控制器,正如我所期望的那样。
猜你喜欢
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-20
  • 2012-04-22
相关资源
最近更新 更多