您走在正确的轨道上,但正确的方法是使用委托。
您在 vc2 中声明了一个委托属性@interface
:
@property (nonatomic, weak) id <vc2delegate> delegate //[1] (in vc2.h)
并且您将委托设置在您的prepareForSegue
:
vc2.delegate = self; //[2] (in vc1.m)
('self' 是 vc1 的正确参考,来自 vc1)
在 vc2 中定义一个协议,这是您期望 vc1 从 vc2 响应的方法。把它放在 vc2.h 中,在你的上面@interface
@protocol vc2delegate //[3] (in vc2.h)
- (void) delegateMethod;
@end
然后你必须确保你在vc1中实现了那个方法。您还需要让 vc1 知道遵守委托。将 vc2 导入 vc1.h,然后在 vc1 的@interface
行中,在尖括号中添加协议名称:
#import vc2.h
@interface vc1 <vc2delegate> //[4] (in vc1.h)
这种安排允许 vc2 将方法传递给 vc1,而无需#include
vc1 或知道任何关于它的信息。
更多详情...
这是你的正确形式
@property (strong, nonatomic) ViewController1 *vc1Reference;
注意weak
引用的使用。您不想进行strong
引用,因为您真的不想与委托有任何关系,除非知道它可以处理您在协议中指定的方法。委托通常是创建委托者的对象,strong
在另一个方向创建引用会导致内存泄漏,因为这两个对象都不会消失。
这是您的行的正确形式:
vc2.vc1Reference = (ViewController1*)segue.sourceViewController;
请注意,我们没有在 1 或 2 中使用类型/强制转换。为了最大程度地重用代码/解耦,我们不想对 segue 两端的对象类型做出任何假设。我假设您的“prepareForSegue”在 vc1 中。如果不是,那么该行将如下所示:
vc2.delegate = segue.sourceViewController
这是协议声明。它位于 vc2 的头文件中。vc2 正在发布它对选择成为其委托的任何对象的期望。vc2 将根据此协议发送消息,因此任何委托都需要以正确的方式响应。您可以通过使用这种消息传递来防止 vc2 中的故障
if (self.delegate respondsToSelector:@selector('delegateMethod')
{
[self.delegate delegateMethod];
}
(这是您将在 vc2 中用于与 vc1 通信的那种消息传递的示例。您显然可以传递参数并在需要时返回返回的结果)
这是编译器的助手,如果您未能实现协议,它会向您发出警告。
最后,在您的对象定义中的某个地方,您需要实现该方法:
- (void) delegateMethod
{
// someaction;
}