12

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

编辑:

这个问题基本上归结为如何获得对 UIViewController-2 的引用,该引用由 UIViewController-1 内的 UIContainerView 指向。UIViewController-1 通过选择一行 UITableViewController 触发

UITableViewController(选择要给出的行)---> UIViewController-1 其中包含....ContainerView --->UIViewController-2(ViewController associated with ContainerView) 。

4

5 回答 5

28

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

故事板

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

你可以做的是:

  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. 为您的 embed segue 重复此过程,即为您的 embed segue 提供其自己的唯一标识符(例如Embed)并在“第二个视图控制器的子”视图控制器中创建一个属性以接收传递给它的值(例如someStringValue),并具有prepareForSegue在第二个视图控制器中,将值传递给它的子视图控制器,例如:

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        if ([segue.identifier isEqualToString:@"Embed"])
        {
            [segue.destinationViewController setSomeStringValue:self.someStringValue];
        }
    }
    
于 2013-09-07T15:10:57.657 回答
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]

于 2014-06-05T14:35:04.007 回答
1

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

我不明白你为什么需要其他任何东西。如果您希望目标控制器包含另一个控制器(为什么?),您可以为目标控制器提供@property指向该控制器的 a,然后您可以读取并设置此属性。

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

于 2013-09-07T11:08:27.347 回答
0

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

于 2013-09-07T14:05:19.087 回答
-1

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

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

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

          }


  }

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

这里

于 2013-09-07T11:17:27.460 回答