如何访问分配给UINavigationController的viewController中声明的属性?

时间:2013-06-05 11:01:50

标签: objective-c uiviewcontroller uinavigationcontroller uitabbarcontroller

我正在尝试实现一个完全有五个标签的应用程序。每个选项卡对应一个视图控制器,例如viewController1~viewController5。

对于viewController4,我在AppDelegate.m中添加了navigationController,如下所示:

viewController4 = [[iPhone_ASRAViewController alloc] initWithNibName:@"iPhone_ASRAViewController_iPhone" bundle:nil];
navController1 = [[UINavigationController alloc]initWithRootViewController:viewController4]; 

在iPhone_ASRViewController类中,我在.h文件中声明了如下属性:

 @property (nonatomic, retain) NSString *student_id;

然后,我想访问在FirstViewController中的iPhone_ASRViewController中声明的student_id(设置student_id),并在FirstViewController.m中实现如下:

iPhone_ASRAViewController *iphone_ASRAVC= [self.tabBarController.viewControllers objectAtIndex:3];
iphone_ASRAVC.student_id=[stu_class stringByAppendingString:stu_id]; 
//stu_class and stu_id is the text field declared in the FirstViewController.

理想情况下,当用户推送在FirstViewController类中实现的某个按钮时,student_id的值也将设置为iPhone_ASRAViewController类。

不幸的是,当用户按下按钮时,应用程序将崩溃。错误消息如下:

[UINavigationController setStudent_id:]: unrecognized selector sent to instance 0x9341170 

有人可以为我提供调试的一些想法/解决方案吗?

1 个答案:

答案 0 :(得分:0)

好吧,如果标签栏中的视图控制器有(或更好)导航控制器,则标签栏控制器的viewControllers数组包含导航控制器。实际上,你(或你的故事板)把它们放进去了! 它可能是视图控制器和导航控制器的混合,取决于在创建或重新配置(如果有)标签栏时实际设置的内容。

所以我很想从给定索引的viewContollers接收对象到类型ID的东西。然后检查它是否是导航控制器(使用isKindOfClass:[iPhone_ASRAViewController class]),如果是,则直接使用它。如果没有,那么检查它是否是UINavigationConroller类(或者反过来 - 对你来说更方便),如果是这样的话,获取它的topViewController属性并从那里开始。

编辑:添加以回应评论:

id someController = [self.tabBarController.viewControllers objectAtIndex:3];
if (someController isKindOfClass:[UINavigationController class]) {
  someController = [someController topViewController]; //re-using someController
}
// someController should be a UIViewController from here onwards. But you may double check if you want.
if (someController isKindOfClass:[iPhone_ASRAViewController class]) {
  iPhone_ASRAViewController *myIPhone_ASRAViewController (iPhone_ASRAViewController*) someController; 
  // you may now savely access those properties that are unique to your custom view controller class
}