parentViewController的值

时间:2011-01-09 00:20:11

标签: iphone

此类是UITabBarViewController的子类。 在我的init父视图控制器文件中,我有:

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];

我想从childviewcontroller类中的parentviewcontroller获取一个值,该类也是一个UITabBarViewController子类。

我该怎么做,我已经尝试了几个小时,而且我只得到一个零参考。

我想要获取的对象(父级中的属性)是NSString。

提前致谢

2 个答案:

答案 0 :(得分:4)

最干净的方法可能是创建父视图控制器实现的ChildViewControllerDelegate协议。这是iOS开发中常见的习语。

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

然后你应该让ChildViewController将此委托作为实例变量并通过属性分配

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

现在,从ChildViewController中,您可以使用此委托访问委托上的方法,在您的情况下,该方法将是ParentViewController。这将允许您检索所需的字符串。

[delegate getSomeNSString]

对于简单的事情来说,这看起来似乎很多,但它避免了将ChildViewController的后引用存储到其父ParentConController时继承的问题。

答案 1 :(得分: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.tabBarControllerself.navigationController,具体取决于上下文),但上述方法是万无一失的,易于理解且易于调试