2013-07-20 59 views
20

我有一个设置在XCode中的故事板,并有一个MainViewController。在MainViewController中,我添加了一个ContainerView,它自然会与另一个VIewController创建一个Segue。如何将数据从我的ViewController传递到容器视图?

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

有人可以帮助我,因为我正在努力与此。必须有一个简单的方法,但我无法破解它!

谢谢

回答

24

您可以使用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中给你的名字与你在if语句中检查的名字相匹配。在这个例子中,labelString是你在嵌入式控制器中设置的字符串属性。然后在该控制器的viewDidLoad方法中,可以使用该字符串设置标签的值。

+0

我不太明白。我对此很新,所以如果你愿意提供一些代码示例,那么这将非常有用。 – Omar

+0

@Omar,我用代码编辑了我的答案。 – rdelmar

+0

谢谢你。所以,现在我的代码看起来是这样的: - (空)prepareForSegue:(UIStoryboardSegue *)赛格瑞发件人:(ID)发送 { 如果([SEGUE符] isEqualToString:@ “MainChild”]){ MainViewController * embed = segue.destinationViewController; embed.labelNextPrayer = self.labelNextPrayer; } } 但是,我打电话给我的标签仍然无法链接到ContainerView中称为'视图控制器' – Omar

0
- (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]; 
    } 
} 

我还要提到的是,因为你使用的是容器视图,prepareForSegue将被触发时,你会出现保存容器中的ViewController

+0

非常感谢。我对'[vc setMyObjectHere:object]'有点困惑,'部分。我在ViewDidLoad方法中使用了由MainViewController拾取的Outlets的代码。我只是希望能够将这些出口链接到容器视图中的元素(这是与Segue链接的独立视图控制器) – Omar

+0

您应该在上面的代码中传递数据。如果它的字符串,创建一个字符串数组并传递它。看看我的答案在这里关于传递数据:http://stackoverflow.com/a/16670995/1578927 – Segev

5

这与在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标识符。

0

答案斯威夫特4:

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