我无法实现此帖中描述的协议和委托关系: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方法中,并收到这些错误::
答案 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)
选择器initWithNib:bundle:
确实是错误的。如果您查看UIViewController文档,您会看到它应该是initWithNibName:bundle:
。
您在viewControllerB.delegate =
self
之后省略了分号。