我想将对象从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);
}