iPhone:孩子怎么能告诉他的父母做某事

时间:2011-09-21 20:21:04

标签: iphone objective-c cocoa-touch model-view-controller parent-child

好的,我有一个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足以让孩子知道父母有一个名为doS​​omethingParent的方法......

我非常感谢任何建议。提前谢谢!

3 个答案:

答案 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