【问题标题】:Pass data through view controller, tab bar controller, navigation controller and to view controller通过视图控制器、标签栏控制器、导航控制器和视图控制器传递数据
【发布时间】:2015-02-10 19:47:37
【问题描述】:

这可能很容易实现,但我是 iOS 编程新手,我似乎被卡住了。

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

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

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

我被困在这里的部分是尝试将数据从第一个 View Controller 传递到任何其他 View Controller 时。在添加导航控制器之前,我使用 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:]: unrecognized selector sent to instance 0x7ffa6acec620'

我尝试过修改代码,但似乎没有任何效果。我只是很困惑,也许正确方向的提示会对我有所帮助。

【问题讨论】:

    标签: ios objective-c uinavigationcontroller storyboard uitabbarcontroller


    【解决方案1】:

    由于您将视图控制器嵌入到导航控制器中,它们不再是标签栏的直接子级;但是,您将标签栏控制器的子级转换为导航控制器以外的其他东西。您想首先获取导航控制器,它是标签栏控制器的子级,然后获取该导航控制器的子级。这将是您的视图控制器。然后,您可以为此设置数据。

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

    【讨论】:

    • 虽然你和Mrunal都有相同的答案,但在我看来你的解释似乎更好。感谢您纠正我犯的错误。
    【解决方案2】:
    - (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。

    【讨论】:

      猜你喜欢
      • 2011-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-06
      • 1970-01-01
      • 2015-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多