21

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

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

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

谢谢

4

4 回答 4

28

您可以像使用任何其他两个控制器一样使用 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 方法中,您可以使用该字符串设置标签的值。

于 2013-07-20T15:03:40.313 回答
7

这与rdelmar仅在 Swift 中提供的答案几乎相同。

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

于 2016-04-22T10:15:34.880 回答
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];
    }
}

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

于 2013-07-20T15:13:17.357 回答
0

斯威夫特 4 的答案:

if let controller = segue.destinationController as? MyEmbeddedController, segue.identifier!.rawValue == "EmbedSegue" {
    controller.labelString = self.stringToPass
}
于 2018-01-11T19:37:23.613 回答