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

rob*_*408 13 iphone objective-c

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

NSLog(@"%@", self.parentViewController.venue.name);
Run Code Online (Sandbox Code Playgroud)

NSLog(@"%@", self.tabBarController.venue.name);
Run Code Online (Sandbox Code Playgroud)

但XCode给出了错误

error: request for member 'venue' in something not a structure or union
Run Code Online (Sandbox Code Playgroud)

我可以从内部访问场地属性,MainViewController所以在那里排除了错误.iPhone模拟器确实看到了两者self.parentViewControllerself.tabBarController作为一个实例MainViewController.这条线......

NSLog(@"%@", self.tabBarController);
Run Code Online (Sandbox Code Playgroud)

输出...

2009-06-05 17:54:46.502 Venue[29729:20b] <MainViewController: 0x536600>
Run Code Online (Sandbox Code Playgroud)

由于它被视为一个MainViewController实例,我怀疑使用铸造会有所帮助.我唯一的另一个选择是HomeViewController用场地的副本来初始化,或者我只是做了一些完全错误的' self.parentViewController.venue.name'?谢谢,罗布

Ed *_*rty 27

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

UIViewController没有Venue会员 你呢MainViewController.事实上,施放它是正确的答案.一定要导入MainViewController.h.

#import "MainViewController.h"
[...]
NSString *name = ((MainViewController *)self.parentViewController)).venue.name;
Run Code Online (Sandbox Code Playgroud)

另外,还要确保,当然,前提是venue被声明为@propertyMainViewController的,并且name@propertyVenue.

  • 好极了!至少我看起来不像一个可怕的人! (3认同)
  • 公平地说,他的问题是“我唯一的其他选择是使用场所的副本来初始化HomeViewController还是我只是对'self.parentViewController.venue.name'做了完全错误的事情?” (2认同)
  • 事实发生两年后,我在这里告诉@EdMarty当他第一次写幽默时,我在他的回答中看到了幽默。都很好。 (2认同)