Objective c 访问父视图控制器(自定义)属性
我已经编写了一个Objective c 访问父视图控制器(自定义)属性,objective-c,iphone,Objective C,Iphone,我已经编写了一个UITabBarController子类(称为MainViewController),并添加了几个实例变量,特别是类型为venue的vention。MainViewController的每个选项卡都需要访问MainViewController的场馆变量。在第一个选项卡中,一个名为HomeViewController的UIViewController子类中,我编写了我的viewDidLoad方法,并尝试使用这两种方法输出到NSLog NSLog(@"%@", self.parent
UITabBarController
子类(称为MainViewController
),并添加了几个实例变量,特别是类型为venue的vention。MainViewController
的每个选项卡都需要访问MainViewController
的场馆变量。在第一个选项卡中,一个名为HomeViewController
的UIViewController
子类中,我编写了我的viewDidLoad
方法,并尝试使用这两种方法输出到NSLog
NSLog(@"%@", self.parentViewController.venue.name);
及
但是XCode给出了错误
error: request for member 'venue' in something not a structure or union
我可以从MainViewController
中访问场地属性,因此排除了那里的错误。iPhone模拟器确实将self.parentViewController
和self.tabBarController
视为MainViewController
的实例。那条线
NSLog(@"%@", self.tabBarController);
输出
2009-06-05 17:54:46.502 Venue[29729:20b] <MainViewController: 0x536600>
2009-06-05 17:54:46.502地点[29729:20b]
由于它被视为一个
MainViewController
实例,我怀疑使用casting是否会有所帮助。是我用场地副本初始化HomeViewController
的唯一其他选项,还是我只是对“self.parentViewController.venture.name
”做了一些完全错误的事情?谢谢,罗伯,你做错了什么parentViewController
被声明为UIViewController
NSLog
ing由于多态性的奇妙之处,它输出其真实类型
UIViewController
没有场馆
会员。您的MainViewController
。事实上,这是正确的答案。确保同时导入MainViewController.h
#import "MainViewController.h"
[...]
NSString *name = ((MainViewController *)self.parentViewController)).venue.name;
当然,还要确保
vention
声明为MainViewController的@属性,并且name
是vention
的@属性,您的NSLog()
语句将其“视”为MainViewController
,因为对象实际上就是这样的。但是,您遇到的问题是编译器实际上没有意识到这一点,因为parentViewController
属性被声明为普通的旧UIViewController
。即使您实际上返回了它的一个子类,但据编译器所知,您试图在UIViewController
上调用该方法,并且它会抱怨。将其转换为MainViewController
将解决此问题。您是否正确地将场地和名称设置为属性?i、 e.书面KVC兼容访问器或使用@property和@Synthesis?太棒了,谢谢。我早就试着找对演员了,但把我的支架搞糟了。回答得很好。不过,我认为第一句话是不必要的。这是一个很好的问题。公平地说,他的问题是“这是我用场地副本初始化HomeViewController的唯一其他选择,还是我只是对‘self.parentViewController.venture.name’做了一些完全错误的事情?”两年后,我来到这里告诉@EdMarty,当他第一次写这篇文章时,我在他的答案中看到了幽默。都很好,耶!至少我看起来不像个可怕的人!
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];
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];