【问题标题】:How do I pass data from my ViewController to a Container View?如何将数据从 ViewController 传递到容器视图?
【发布时间】:2013-07-20 14:55:37
【问题描述】:

我在 XCode 中设置了一个故事板,并有一个 MainViewController。在 MainViewController 中,我添加了一个 ContainerView,它自然地与另一个 VIewController 创建了一个 Segue。

在我的 MainViewController.m 文件中,我设置了数据并希望将此数据链接到 ContainerView 中的标签,但是我认为我可以单击文件所有者并执行此操作,但我当然不能,因为它们是 2现在不同的视图控制器。

有人可以帮助我吗,因为我正在为此苦苦挣扎。一定有一个简单的方法,但我无法破解它!

谢谢

【问题讨论】:

    标签: ios objective-c uiviewcontroller


    【解决方案1】:

    您可以像使用任何其他两个控制器一样使用 prepareForSegue —— 该方法将在两个控制器被实例化之后,但在任何一个 viewDidLoad 运行之前被调用。另一种方法是使用父控制器的 childViewControllers 属性(嵌入式控制器是子控制器)。因此,孩子将是 self.childViewControllers[0]。

    编辑后:

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        if ([[segue identifier] isEqualToString:@"EmbedSegue"]) {
            MyEmbeddedController *embed = segue.destinationViewController;
            embed.labelString = self.stringToPass;
        }
    }
    

    当然,您必须将名称更改为您拥有的名称。确保您在 IB 中为 segue 提供的名称与您在 if 语句中检查的名称相匹配。在此示例中,labelString 是您在嵌入式控制器中设置的字符串属性。然后在该控制器的 viewDidLoad 方法中,您可以使用该字符串设置标签的值。

    【讨论】:

    • 我不太明白。我对此很陌生,所以如果您愿意提供一些代码示例,那将非常有帮助。
    • 谢谢。所以现在我的代码看起来像这样: - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([[segue identifier] isEqualToString:@"MainChild"]) { MainViewController *embed = segue.destinationViewController ; embed.labelNextPrayer = self.labelNextPrayer;但是,我调用的标签仍然无法链接到 ContainerView 中称为“视图控制器”的任何内容
    • @Omar,你不能那样做——两个控制器的 viewDidLoad 方法在调用 prepareForSegue 时还没有运行,所以你不能访问标签来自父母的孩子。在任何情况下,你都不应该这样做——让孩子填充自己的标签。您应该像我在编辑中所说的那样将数据(字符串或其他)传递给孩子的属性。
    • @redelmar 好的,只是为了分解它。我有一些在 ViewDidLoad 方法中运行的“祈祷时间”,并在其中读取 if ([key isEqual: @"(null)"]) { [self getDataFromJson2]; } else { labelNextPrayer.text = key;我想调用 labelNextPrayer.text 并将其链接到通过 Segue 连接的 ContainerView 中的 UILabel。我只是停留在那个部分
    • @Omar,你想用它做什么?那个控制器在哪个?哪个控制器有标签 labelNextPlayer?您需要更全面地解释。
    【解决方案2】:

    这与仅在 Swift 中的 one by rdelmar 几乎相同。

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if let embeddedVC = segue.destinationViewController as? MyEmbeddedController where segue.identifier == "EmbedSegue" {
            embeddedVC.labelString = self.stringToPass
        }
    }
    

    "EmbedSegue" 必须是您在 Interface Builder 中设置的 segue 标识符。

    【讨论】:

      【解决方案3】:
      - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
      {
          // Make sure your segue name in storyboard is the same as this line
          if ([[segue identifier] isEqualToString:@"YOUR_SEGUE_NAME_HERE"])
          {
              // Get reference to the destination view controller
              YourViewController *vc = [segue destinationViewController];
      
              // Pass any objects to the view controller here, like...
              [vc setMyObjectHere:object];
          }
      }
      

      我还应该提到,因为您使用的是 Container 视图,所以当您展示包含 Container 的 ViewController 时,将触发 prepareForSegue

      【讨论】:

      • 非常感谢。我只是对“[vc setMyObjectHere:object];”有点困惑部分。我在带有 Outlets 的 ViewDidLoad 方法中有一大堆代码,这些代码由 MainViewController 拾取。我只是希望能够将这些 Outlets 链接到容器视图中的元素(这是一个与 Segue 链接的单独视图控制器)
      • 你应该在上面的代码中传递数据。如果是字符串,则创建一个字符串数组并传递它。在这里查看我关于传递数据的答案:stackoverflow.com/a/16670995/1578927
      【解决方案4】:

      Swift 4 的答案:

      if let controller = segue.destinationController as? MyEmbeddedController, segue.identifier!.rawValue == "EmbedSegue" {
          controller.labelString = self.stringToPass
      }
      

      【讨论】:

        猜你喜欢
        • 2021-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多