实现委托和协议以在视图之间传递数据

时间:2013-08-29 20:01:46

标签: objective-c delegates protocols

我无法实现此帖中描述的协议和委托关系:Passing Data between View Controllers

在“传递数据”部分下,#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 个答案:

答案 0 :(得分:2)

  

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

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

答案 1 :(得分:2)

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

尝试将此代码放在ViewControllerA内的-viewDidAppear类中。

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

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

编辑:还想让您知道特殊关键字self是什么。它有点像JavaScript中的this。当您使用self时,您正在引用您所在的当前班级。因此,如果您正在使用ViewControllerB的.m文件,并键入self,则self == instance of ViewControllerB。您最初表示您试图使ViewControllerA成为B的委托。在这种情况下,您将使ViewControllerB的当前实例成为ViewControllerB的 new 实例的委托。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

  1. 选择器initWithNib:bundle:确实是错误的。如果您查看UIViewController文档,您会看到它应该是initWithNibName:bundle:

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