获取对容器视图视图的引用

时间:2013-09-07 10:58:20

标签: ios objective-c uiviewcontroller segue uistoryboardsegue

我是iOS App Development的新手。我连接了一个tableview控制器,这样当我选择其中一行时,我会使用didSelectRowAtIndexPath获得另一个UIViewController。我在这个UIViewController中有一个容器视图,它显示(当然是)调用didSelectRowAtIndexPath的行的索引。我想使用segue来做这个,但问题是我不知道如何获得对使用容器视图形成的视图控制器的引用。我知道你可以在prepareForSegue中使用segue.destinationViewController获取目标View Controller但是如何获得对由于容器视图而将加载的视图控制器的引用。我正在构建适用于iOS 6的应用程序。此外,我还使用了Storyboard作为UI。感谢

编辑:

这个问题基本上归结为如何获取UIVonConiner-1中UIVontainerView指向的UIViewController-2的引用。通过选择一行UITableViewController

来触发UIViewController-1

UITableViewController(选择要给出的行)---> UIViewController-1包含.... ContainerView ---> UIViewController-2(与ContainerView关联的ViewController)。

5 个答案:

答案 0 :(得分:28)

好的,让我们想象一下这个场景:

storyboard

让我们假设您要更新“第二个视图控制器的子节点”上的标签,其中模型数据支持您在表格视图中点击的单元格。

你能做的是:

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

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

    prepareForSegue

答案 1 :(得分:4)

正如其他人所说,可以覆盖prepareForSegue来定位子视图控制器 - 我个人更喜欢使用UIViewController.childControllers,因为你可以在嵌入segue出现之外的时间访问它,即

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

不建议您这样做但是如果您正在使用故事板,那么childControllers数组的顺序与接口构建器中的顺序完全相同,因此您可以直接引用childViewControllers [0],[1]

答案 2 :(得分:1)

你对prepareForSegue是正确的。 destinationViewController将为您提供目标视图控制器。

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

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

答案 3 :(得分:0)

如果您正在创建一个模拟导航栏,那么使用容器视图和子视图控制器是不必要的复杂和内存密集型。只需在视图控制器1中创建模拟导航栏作为视图,为其指定包含标题的标签,将标签作为插座连接,然后根据需要设置标签。更清洁,更简单。

答案 4 :(得分:-1)

声明Cell Reuse Identifier并使用此方法。

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{

   if([segue.identifier isEqualToString:@"nameOfSegue"])
         {

          }


  }

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

Here