通过视图控制器,标签栏控制器,导航控制器和视图控制器传递数据

这可能是一个非常简单的实现,但我是iOS新手,我似乎被卡住了。

所以,基本上,我有一个选项卡式的应用程序。 我决定除了标签栏以外我还想要一个导航栏。 为了做到这一点,我把标签栏控制器,然后我添加我的视图控制器,并embedded到每个视图控制器的导航控制器,然后连接到标签栏。

我在故事板中的层次结构看起来有点像这样:

  1. 视图控制器
    1. 标签栏控制器
      1. 导航控制器
        1. 视图控制器
      2. 导航控制器
        1. 视图控制器

我在这里卡住的部分是当试图从第一个视图控制器和任何其他视图控制器传递数据。 在添加导航控制器之前,我正在使用prepareForSegue方法传递数据,如下所示:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([[segue identifier] isEqualToString:@"logged"]) { UITabBarController *tabar=segue.destinationViewController; SecondViewController *svc=[tabar.viewControllers objectAtIndex:1]; svc.groupArray = [(NSArray*)sender objectAtIndex:0]; svc.userArray = [(NSArray*)sender objectAtIndex:1]; svc.taskArray = [(NSMutableArray*)sender objectAtIndex:2]; svc.selfArray = [(NSMutableArray*)sender objectAtIndex:3]; [tabar setSelectedIndex:1]; } } 

正如你所看到的,我将数据传递给了我的第二个视图控制器,并使用performSegueWithIdentifier方法将标签栏索引设置为1,因为我希望打开第二个页面。 所有这一切都工作得很好,直到我介绍了导航控制器到我的代码,因为我想要导航栏。 这是一切都非常糟糕的时候。 如果我尝试按原样运行代码,则应用程序会在控制台中使用以下输出进行崩溃:

[UINavigationController setGroupArray:]:无法识别的select器发送到实例0x7ffa6acec620

***由于未捕获exception'NSInvalidArgumentException',原因:' – [UINavigationController setGroupArray:]:无法识别的select器发送到实例0x7ffa6acec620'

我已经尝试了一下代码,但是没有任何东西真的可以工作。 我只是很困惑,也许正确的方向提示会帮助我一点点。

由于您将视图控制器embedded到导航控制器中,因此它们不再是tabbar的子项; 但是,您要将TabBar控制器的子项作为导航控制器以外的其他项目。 您想先获取导航控制器,这是TabBar控制器的子项,然后获取该导航控制器的子项。 这将是你的视图控制器。 然后你可以设置数据。

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([[segue identifier] isEqualToString:@"logged"]) { UITabBarController *tabar=segue.destinationViewController; UINavigationController *navController = [tabbar.viewControllers objectAtIndex:1]; SecondViewController *svc=[navController.viewControllers objectAtIndex:0]; svc.groupArray = [(NSArray*)sender objectAtIndex:0]; svc.userArray = [(NSArray*)sender objectAtIndex:1]; svc.taskArray = [(NSMutableArray*)sender objectAtIndex:2]; svc.selfArray = [(NSMutableArray*)sender objectAtIndex:3]; [tabar setSelectedIndex:1]; } } 
 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([[segue identifier] isEqualToString:@"logged"]) { UITabBarController *tabar=segue.destinationViewController; UINavigationController *navc =[tabar.viewControllers objectAtIndex:1]; SecondViewController *svc=[nvc.viewControllers objectAtIndex:0]; svc.groupArray = [(NSArray*)sender objectAtIndex:0]; svc.userArray = [(NSArray*)sender objectAtIndex:1]; svc.taskArray = [(NSMutableArray*)sender objectAtIndex:2]; svc.selfArray = [(NSMutableArray*)sender objectAtIndex:3]; [tabar setSelectedIndex:1]; } } 

由于您已经使用UINavigationController更改了UITabbarController根目录,因此从UITabbarController获取视图控制器时,它将是导航控制器types。

然后你必须从导航控制器中获取SecondViewController。