iPhone: Как ребенок может сказать своему родителю что-то сделать - PullRequest
1 голос
/ 22 сентября 2011

ОК, у меня есть 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 ...

Я был бы очень признателен за любые предложения.Заранее спасибо!

Ответы [ 3 ]

5 голосов
/ 22 сентября 2011

Установить объект rootViewController в качестве делегата объекта типа childViewController.И используйте этот делегат из ChildViewController для передачи сообщений в RootViewController.

Внутри RootViewController, когда вы создаете объект ChildViewController, выполните:передайте его RootViewController как:

[delegate doSomething];

В интерфейсе ChildViewController.h объявите ivar:

id delegate;

Затем используйте @property (в .h) и @synthesize (в.m) для геттера и сеттера.

Затем выполните вышеуказанное.

3 голосов
/ 22 сентября 2011

super - это ссылка на его суперкласс, а не на родительский контроллер представления.Вам нужно будет сохранить ссылку на RootViewController и передать ей сообщение ...

... Или кодировать протокол и установить RootViewController в качестве делегата дочернего элемента, чтобы дочерний элементвозможность передавать сообщения на RootViewController.

Я предпочитаю второй способ.

0 голосов
/ 22 сентября 2011

Простой способ (возможно, не самый лучший):

self.child = cvc;
cvc.myParent = self;  // give the child a reference to its parent
...