如何将对象从视图传递到嵌入在作为容器视图的 Tabbar 控制器中的导航控制器中的视图?

  • 本文关键字:视图 控制器 Tabbar 导航 对象 ios objective-c segue
  • 更新时间 :
  • 英文 :


我想将对象从ViewA传递到ViewB,但ViewB嵌入在导航控制器中,导航控制器嵌入在选项卡栏控制器中,选项卡栏控制器是容器视图的视图。

我在prepareforsegue中尝试过,但值没有传递到目的地。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"OpenProjectsSegue"]) {
        ContainerViewController *cvc = segue.destinationViewController;
        UITabBarController *tbc = cvc.tabBarController;
        UINavigationController *nav = tbc.viewControllers[0];
        IncomeViewController *vc = (IncomeViewController *)nav.topViewController;
        vc.projectIndexToOpen = @1;
        vc.testString = @"hola peru";
    } 
}

我也尝试过UITabBarController *tbc = cvc.childviewcontroller[0],但收到了一条空数组错误消息。

请帮忙。非常感谢。

我有一个可能有效的答案。

在ViewController.h的顶部写:

extern UITabBarController *tbc;

然后,在顶部的ViewController.m中写入:

UITabBarController *tbc;

此外,您必须#将您的类包括在您试图访问UITabBarController的任何文件中,但这将使UITabBarController成为一个全局变量,您可以在多个文件中访问它。

问题出在时间上。ContainerViewController的viewControllers属性在prepareForSegue中为空,因为所有其他控制器尚未初始化或添加为子控制器。我做了和你一样的设置,当我记录它们生命周期中的各个阶段时,这就是我得到的,

2014-04-21 17:01:23.930 PassingAheadInComplexHierarchyProblem[13653:60b] In ContainerViewController init
2014-04-21 17:01:23.931 PassingAheadInComplexHierarchyProblem[13653:60b] In prepareForSegue in ProjectTypeViewController
2014-04-21 17:01:23.931 PassingAheadInComplexHierarchyProblem[13653:60b] ContainerViewController's children are (logged from prepareForSegue): (
)
2014-04-21 17:01:23.934 PassingAheadInComplexHierarchyProblem[13653:60b] In IncomeViewController init
2014-04-21 17:01:23.935 PassingAheadInComplexHierarchyProblem[13653:60b] In NavController init
2014-04-21 17:01:23.936 PassingAheadInComplexHierarchyProblem[13653:60b] In TabBarController init
2014-04-21 17:01:23.937 PassingAheadInComplexHierarchyProblem[13653:60b] In TabBarController viewDidLoad
2014-04-21 17:01:23.937 PassingAheadInComplexHierarchyProblem[13653:60b] In TabBarController didMoveToParentVC: <ContainerViewController: 0x8c227c0>
2014-04-21 17:01:23.937 PassingAheadInComplexHierarchyProblem[13653:60b] In ContainerViewController viewDidLoad
2014-04-21 17:01:23.940 PassingAheadInComplexHierarchyProblem[13653:60b] In NavController viewDidLoad
2014-04-21 17:01:23.948 PassingAheadInComplexHierarchyProblem[13653:60b] In IncomeViewController viewDidLoad
2014-04-21 17:01:24.452 PassingAheadInComplexHierarchyProblem[13653:60b] In IncomeViewController didMoveToParentVC: <NavController: 0x8e4f860>

正如您所看到的,在调用prepareForSegue时,只有ContainerViewController已经初始化。

在IncomeViewController中获取所需数据的一种方法是获取对ProjectTypeViewController的引用,并查询其属性。该引用很容易获得,因为ProjectTypeViewController将是IncomeViewController的presentingViewController。所以,如果你在两个控制器中都有名为projectIndexToOpen的属性,你可以在IncomeViewController、中这样做

- (void)viewDidLoad {
    [super viewDidLoad];
    self.projectIndexToOpen = [(ProjectTypeViewController *)self.presentingViewController projectIndexToOpen];
    NSLog(@"%@",self.projectIndexToOpen);
}

最新更新