什么时候使用presentViewController是合适的时间?

时间:2013-02-14 17:24:58

标签: ios segue viewcontroller

假设我正在使用segue转换视图控制器。我在View Controller 1上有一个textField,在第二个视图控制器上有一个标签。当我正在转向第二个视图控制器时,我可以使用以下代码轻松设置标签:

ViewController#2

-(void) viewWillAppear: (BOOL) animated
{ 
 self.labelVC2.text = ((VC1 *)self.presentingViewController).textFieldVC1.text;
}

这很有道理。在这种情况下正在使用presentViewController属性。在尝试确定何时使用presentViewController属性时,似乎合乎逻辑的是它将在prepareForSegue方法中的第一个视图控制器中使用,如下所示:

ViewController#1

 -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
 {
    if([[segue identifier] isEqualToString:@"SegueToNextVC"])
    {
       ((VC2 *)self.presentedViewController).labelVC2.text = self.textFieldVC1.text;
    }
 }

然而,这似乎不起作用,我假设它是因为在prepareForSegue中我的第二个视图控制器的新实例在segue发生之前被调用,因此失去了我刚刚设置的属性。如果我在这方面是正确的,何时适合使用presentViewController属性?显然我不会在我的第二个视图控制器上使用这个属性,因为我可以直接访问该类。

1 个答案:

答案 0 :(得分:0)

查看UIStoryboardSegue的{​​{3}}。它有几个属性我认为对你非常有用。

sourceViewController - “...查看控制器,其内容显示在segue的开头”,即self

destinationViewController - “...查看控制器,其内容应显示在segue的末尾”,这是您尝试通过VC2访问的self.presentedViewController

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
 {
    if([[segue identifier] isEqualToString:@"SegueToNextVC"])
    {
       ((VC2 *)destinationViewController).labelVC2.text = self.textFieldVC1.text;
    }
 }

回到你的问题......你什么时候想用presentedViewController?答案是,只要您还没有presentedViewController的引用。这是一个例子。

你有很多类都有相同的父级。 SubViewController1SubViewController2SubViewController3这些都是MyViewController的子类,您现在可能也可能没有。所以你想检查它是否存在并告诉它完成它正在做什么并离开。令人高兴的是,MyViewController上有一种方法可以让你做到这一点。

if (self.presentedViewController) {
    MyViewController *subVC = (MyViewController *)self.presentedViewController;
    [subVC finishAndGoAway];
}

这只是您可以使用它的一个示例。在许多其他情况下它会很有用,但也有很多时候它完全没有意义,因为你已经有了一些参考,所以你不需要使用默认的。