好的,我有一个RootViewController.m并在那里定义了一个方法:
-(void)doSomethingParent
{
NSLog(@"Parent is doing something after child has asked");
}
然后我添加了一个childViewController.view,如下所示:
if (self.child == nil) {
ChildViewController *cvc = [[ChildViewController alloc]
initWithNibName:nil bundle:nil];
self.child = cvc;
[cvc release];
}
[self.view insertSubview: child.view atIndex:0];
现在,我认为如果我可以从孩子那里调用我的doSomethingParent方法,那将非常有用。所以我想我会这样做:
@implementation ChildViewController
@class RootViewController;
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[super doSomethingParent];
}
但是xCode告诉我“-doSomethingParent”没有找到......但我把@class放在那里?!不应该找到它吗?我不想导入整个东西,因为我认为@class足以让孩子知道父母有一个名为doSomethingParent的方法......
我非常感谢任何建议。提前谢谢!
答案 0 :(得分:5)
将rootViewController对象设置为childViewController类型的对象的委托。并使用来自ChildViewController的该委托将消息传递给RootViewController。
在RootViewController内部,当您创建ChildViewController对象时执行:
childViewController.delegate = self;
在ChildViewController中,当你想传递一条消息,然后将它传递给RootViewController:
[delegate doSomething];
在ChildViewController.h界面中,声明一个ivar:
id delegate;
然后使用@property(在.h中)和@synthesize(在.m中)作为getter和setter。
然后执行上述操作。
答案 1 :(得分:3)
super
是对它的超类的引用,而不是父视图控制器。您必须保留对RootViewController
的引用并将消息传递给它...
...或者编写协议并将RootViewController
设置为孩子的代表,这样孩子就可以将邮件传递给RootViewController
。
我更喜欢第二种方式。
答案 2 :(得分:0)
简单的方法(也许不是最好的方式):
self.child = cvc;
cvc.myParent = self; // give the child a reference to its parent