获取对容器视图的引用

我是iOS App开发新手。 我已经连接了一个tableview控制器,当我select其中一个行,我得到另一个使用didSelectRowAtIndexPath的UIViewController。 我有一个容器视图里面这个UIViewController显示(说暂时)didSelectRowAtIndexPath被调用的行的索引。 我想用segue做这个,但问题是我不知道如何获得对使用容器视graphics成的视图控制器的引用。 我知道你可以使用prepareForSegue中的segue.destinationViewController来获取目标视图控制器,但是如何获取将由于容器视图而被加载的视图控制器的引用。 我正在构buildiOS 6的应用程序。我也使用了故事板的UI。 谢谢

编辑:

这个问题基本上归结为如何获得对UIViewController-1内部的UIContainerView所指向的UIViewController-2的引用。 UIViewController-1是通过select一行UITableViewController触发的

UITableViewController(select一行给)—> UIViewController-1其中包含…. ContainerView —> UIViewController-2(ViewController与ContainerView关联)。

好吧,我们来想象一下这个场景:

故事板

假设您想要使用支持在表格视图上点击的单元格的模型数据来更新该“第二个视图控制器的子项”上的标签。

你可以做的是:

  1. 从第一个场景给第二个segue一个唯一的标识符(例如Detail ),在第二个视图控制器中定义一个属性来接收要传递给它的值(例如someStringValue ),并编写一个prepareForSegue来传递值:

     - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"Detail"]) { NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; [segue.destinationViewController setSomeStringValue:self.objects[indexPath.row]]; } } 
  2. 为你的embeddedsegue重复这个过程,即给你的embeddedsegue自己的唯一标识符(例如Embed ),并创build一个属性在“第二个视图控制器的孩子”视图控制器接收传递给它的值(例如someStringValue ),在第二个视图控制器中有一个prepareForSegue ,它将把值传递给它的子视图控制器,例如:

     - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"Embed"]) { [segue.destinationViewController setSomeStringValue:self.someStringValue]; } } 

正如其他人所说,可以重写prepareForSegue来定位子视图控制器 – 个人而言,我更喜欢使用UIViewController.childControllers,因为您可以在embedded式Segue发生时除外

 -(void)viewDidLoad { for (UIViewController* vc in self.childViewControllers) { if ([vc isKindOfClass:MyChildController.class]) { // do something here } } } 

不build议你这样做,但如果你正在处理故事板的childControllers数组的顺序是完全一样的接口生成器的顺序,所以你可以直接引用childViewControllers [0],[1]

你是对的prepareForSeguedestinationViewController将为您提供目标视图控制器。

我不明白你为什么需要别的东西。 如果您希望目标控制器包含另一个控制器(为什么?),则可以为目标控制器指定一个@property指向该控制器,并且可以读取和设置此属性。

但问题仍然存在 – 你为什么要这样做?

如果你正在做的是创build一个模拟的导航栏然后使用容器视图和子视图控制器是不必要的复杂和内存密集型。 只需在视图控制器1中创build您的模拟导航栏作为视图,给它一个标签,其中包含您的标题,将标签挂钩作为sockets,并根据需要设置标签。 更清洁,更简单。

声明单元重用标识符并使​​用此方法。

 -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ if([segue.identifier isEqualToString:@"nameOfSegue"]) { } } 

请访问以下链接以获取更多参考

这里