2011-01-09 2 views
0

Этот класс является подклассом UITabBarViewController. В моей инициализации родительского файла контроллера представления у меня есть это:Значение от parentViewController

UIBarButtonItem *button1 = [[UIBarButtonItem alloc] 
           initWithTitle:@"Button1" 
           style:UIBarButtonItemStyleBordered 
           target:self 
           action:@selector(button1:)]; 

self.navigationItem.rightBarButtonItem = button1; 

[button1 release]; 

и метод:

-(IBAction)button1:(id)sender { 

if (self.nvc == nil) { 
    ChildViewController *vc = [[ChildViewController alloc] init]; 
    self.nvc = vc; 
    [vc release]; 
} 

[self presentModalViewController:self.nvc animated:YES]; 

Я хочу, чтобы получить значение из parentviewcontroller в моем childviewcontroller классе, который также является подклассом UITabBarViewController ,

Как это сделать, я пробовал несколько часов, и я получаю только нулевую ссылку.

Объект, который я хочу получить (который является свойством родителя), является NSString.

Заранее спасибо

ответ

2

Существует много способов сделать это. Самым простым было бы добавить свойство к ChildViewController, которое указывает на ваш родительский контроллер представления. Вы могли бы назвать это delegate. Тогда этот метод будет выглядеть следующим образом:

-(IBAction)newbuilding:(id)sender { 
    if (self.nvc == nil) { 
     ChildViewController *vc = [[ChildViewController alloc] init]; 
     vc.delegate = self; 
     self.nvc = vc; 
     [vc release]; 
    } 
    [self presentModalViewController:self.nvc animated:YES]; 
} 

Тогда из экземпляра ChildViewController вы можете получить доступ к self.delegate.someProperty.

Есть также способы получить родительский контроллер представления без вашей собственной явной ссылки (обычно self.tabBarController, self.navigationController в зависимости от контекста), но вышеупомянутый метод является безупречным, понятным и легким для отладки.

4

Чистейший путь, вероятно, будет создать ChildViewControllerDelegate протокол, что родительский вид контроллер реализует. Это распространенная идиома в развитии iOS.

@protocol ChildViewControllerDelegate 
- (NSString *)getSomeNSString; 
@end 

Тогда вы должны сделать ChildViewController иметь этот делегат в качестве переменной экземпляра и быть назначаемыми через свойство

@property (nonatomic, assign) id<ChildViewControllerDelegate> delegate; 

Теперь внутри ChildViewController вы можете использовать этот делегат для доступа к методам на делегат, который в вашем case будет ParentViewController. Это позволит вам восстановить нужную строку.

[delegate getSomeNSString] 

Это может показаться, что много работы на что-то простое, но это позволяет избежать проблем наследования с хранением обратной ссылки от ChildViewController к родительскому ParentViewController.