我编写了一个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模拟器确实将MainViewController
和self.parentViewController
视为self.tabBarController
的实例。这条线...
MainViewController
...输出
NSLog(@"%@", self.tabBarController);
由于它被视为2009-06-05 17:54:46.502 Venue[29729:20b] <MainViewController: 0x536600>
实例,我怀疑使用强制转换会有所帮助。我唯一的另一种选择是使用场地副本初始化MainViewController
,还是我只是做了'HomeViewController
'的完全错误?谢谢,Rob
答案 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
将解决问题。