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

时间:2014-12-12 06:12:49

标签: ios objective-c uinavigationcontroller storyboard uitabbarcontroller

这可能是非常简单的事情,但我不熟悉iOS的编程,而且我似乎陷入困境。

所以,基本上,我有一个标签式应用程序。我决定除了标签栏之外我还想要一个导航栏。为此,我放置了标签栏控制器,然后我添加了我的视图控制器并嵌入到每个视图控制器的导航控制器中,然后连接到标签栏。

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

  1. 查看控制器
    1. 标签栏控制器
      1. 导航控制器
        1. 查看控制器
      2. 导航控制器
        1. 查看控制器
  2. 我被困在这里的部分是尝试从第一个视图控制器传递数据到任何其他视图控制器。在添加导航控制器之前,我使用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:]:发送到的无法识别的选择器   实例0x7ffa6acec620

         

    ***由于未捕获的异常终止应用程序' NSInvalidArgumentException',原因:' - [UINavigationController setGroupArray:]:无法识别的选择器发送到实例0x7ffa6acec620'

    我已经尝试过乱用代码,但似乎没有什么工作真正起作用。我只是非常困惑,也许正确方向的暗示会帮助我一点点。

2 个答案:

答案 0 :(得分:2)

由于您将视图控制器嵌入到导航控制器中,因此它们不再是标签栏的直接子项;但是,您将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];
   }
}

答案 1 :(得分: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获取视图控制器时,它将是导航控制器类型。

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