2

我在实现这篇文章中描述的协议和委托关系时遇到了麻烦: 在视图控制器之间传递数据

在“传回数据”部分下,#6 说:

在我们将 ViewControllerB 推送到导航堆栈之前,我们需要做的最后一件事是告诉 ViewControllerB ViewControllerA 是它的委托。

   ViewControllerB *viewControllerB = [[ViewControllerB alloc] initWithNib:@"ViewControllerB" bundle:nil];
   viewControllerB.delegate = self;
   [[self navigationController] pushViewController:viewControllerB animated:YES];

你能帮我描述一下最后一部分代码的去向吗?我已经尝试过,并多次阅读整篇文章,似乎无法在没有出现几个错误的情况下弄清楚这一点。谢谢你的帮助。

更新:我将代码放在 ViewControllerB(子)等效项的 viewDidLoad 方法中,并收到以下错误:

  • 'ViewControllerB' 没有可见的@interface 声明选择器'initWithNib:bundle:'
  • 索引表达式无效,因为下标类型“void”不是整数或 Objective-C 指针类型
4

4 回答 4

2

'ViewControllerB' 没有可见的@interface 声明选择器'initWithNib:bundle:'

这里的问题是您调用了不正确的方法。UIViewController 的方法是initWithNibName:bundle:

于 2013-08-29T20:26:04.830 回答
2

不要将代码放在你的ViewControllerB类中,这会导致recursive loop. 这是一个自我调用的循环,使循环永存。在内部viewDidLoad,代码在视图加载时执行。所以你正在加载一个视图,然后创建一个新的 ViewControllerB 对象,然后加载它,这反过来又会创建一个 ViewControllerB ...

试着把这段代码放在ViewControllerA类里面,里面-viewDidAppear.

每次回来,代码都会再次执行,创建一个新的 ViewControllerB 并推入堆栈。

看看我在博客http://appsylvania.com上发表的最后一篇文章。这是关于使用现实世界的类比来理解代表。稍后我将使用确切帖子的正确 URL 进行更新。

编辑:还希望您知道特殊关键字self是什么。这有点像this在 JavaScript 中。当您使用时self,您正在对您所在的当前类进行引用。因此,如果您在 ViewControllerB 的 .m 文件中工作,并且您键入self,那么self == instance of ViewControllerB. 您最初说您试图让 ViewControllerA 成为 B 的委托。在这种情况下,您正在让 ViewControllerB 的当前实例成为 ViewControllerB 的实例的委托。

于 2013-08-29T20:35:59.533 回答
1

重点在于viewControllerA创造和展示viewControllerB。然而,无论是 segue 还是从 NIB 显式创建,委托都是在 viewControllerB` 创建之后和显示之前设置的。

于 2013-08-29T20:24:54.533 回答
0
  1. 选择器initWithNib:bundle:确实是错误的。如果您查看 UIViewController 文档,您会发现它应该是initWithNibName:bundle:.

  2. 您在 . 之后省略了分号viewControllerB.delegate = self

于 2013-08-29T20:26:19.670 回答