0

我正在尝试实现一个完全有五个选项卡的应用程序。每个选项卡对应一个视图控制器,例如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 

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

4

1 回答 1

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
}
于 2013-06-05T11:47:29.057 回答