【问题标题】:Getting reference to the view of a container view获取对容器视图的引用
【发布时间】:2013-09-07 10:58:20
【问题描述】:

我是 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) .

【问题讨论】:

  • 看来你在这里得到了答案:stackoverflow.com/a/18673394/1187415。我只是想知道这是否与@Mundi 下面所说的相同。
  • 不要两次发布相同的问题。我很想将这个线程作为重复项关闭。
  • @DuncanC 我倾向于关闭另一个,因为它是这个的副本。这是第一个(并且更明确)。

标签: ios objective-c uiviewcontroller segue uistoryboardsegue


【解决方案1】:

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

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

你可以做的是:

  1. 给从第一个场景到第二个场景的转场一个唯一标识符(例如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)并在“第二个视图控制器的子”视图控制器中创建一个属性以接收传递给它的值(例如someStringValue),并在第二个视图控制器中有一个prepareForSegue,它将将该值传递给它的子视图控制器,例如:

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

【讨论】:

  • @Mrug 然后方法完全相同,除了在prepareForSegue 中设置子属性,您可以在以编程方式实例化子并调用addChildViewController 的代码中执行此操作。
【解决方案2】:

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

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

不建议您这样做,但如果您使用情节提要,则 childControllers 数组的顺序与界面构建器中的顺序完全相同,因此您可以直接引用 childViewControllers[0], [1]

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 我正在使用容器来显示另一个视图。此视图实际上充当导航栏,因为默认导航栏具有色调效果(我不喜欢)。我问的问题是关于设置标题(这将是新视图中的标签)。希望这能解决原因
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

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

      Here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-03
        • 1970-01-01
        • 1970-01-01
        • 2013-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多