Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 访问父视图控制器(自定义)属性_Objective C_Iphone - Fatal编程技术网

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