访问父视图控制器(自定义)属性

时间:2009-06-05 17:02:52

标签: objective-c iphone

我编写了一个UITabBarController子类(称为MainViewController)并添加了一些实例变量,特别是Venue类型的场所。 MainViewController的每个标签都需要访问MainViewController的会场变量。在第一个选项卡中,一个名为UIViewController的{​​{1}}子类,我编写了我的HomeViewController方法并尝试使用两者输出到NSLog ...

viewDidLoad

NSLog(@"%@", self.parentViewController.venue.name);

但是XCode给出错误

NSLog(@"%@", self.tabBarController.venue.name);

我可以在error: request for member 'venue' in something not a structure or union 内访问场地属性,所以在那里排除了错误。 iPhone模拟器确实将MainViewControllerself.parentViewController视为self.tabBarController的实例。这条线...

MainViewController

...输出

NSLog(@"%@", self.tabBarController);

由于它被视为2009-06-05 17:54:46.502 Venue[29729:20b] <MainViewController: 0x536600> 实例,我怀疑使用强制转换会有所帮助。我唯一的另一种选择是使用场地副本初始化MainViewController,还是我只是做了'HomeViewController'的完全错误?谢谢,Rob

3 个答案:

答案 0 :(得分:27)

你做的事情完全错了。 parentViewController被声明为UIViewController。由于多态性的奇迹,NSLog输出它的真实类型。

UIViewController没有Venue成员。你的MainViewController确实如此。事实上,施放它是正确的答案。确保也导入MainViewController.h

#import "MainViewController.h"
[...]
NSString *name = ((MainViewController *)self.parentViewController)).venue.name;

当然,还要确保venue被声明为MainViewController的@property,而name@property的{​​{1}}。

答案 1 :(得分:4)

int currentVCIndex = [self.navigationController.viewControllers indexOfObject:self.navigationController.topViewController];

//previous view controller
AccountViewController *account = (AccountViewController *)[self.navigationController.viewControllers objectAtIndex:currentVCIndex - 1];

account.property = object;
[account doSmthng];

答案 2 :(得分:1)

您的NSLog()语句“看到”它是MainViewController,因为这就是对象的实际内容。但是你遇到的问题是编译器实际上没有意识到这一点,因为parentViewController属性被声明为普通的UIViewController。即使你实际上正在返回它的子类,只要编译器知道你试图在UIViewController上调用该方法,它就会抱怨。将其投射到MainViewController将解决问题。