2

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

视图控制器 #2

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

这很有意义。在这种情况下使用 presentingViewController 属性。虽然试图弄清楚什么时候使用 presentViewController 属性,但似乎合乎逻辑的是,它将在 prepareForSegue 方法中的第一个视图控制器中使用,如下所示:

视图控制器 #1

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

但是,这似乎不起作用,我假设这是因为在 prepareForSegue 中,我的第二个视图控制器的一个新实例在 segue 发生之前的那一刻被调用,从而丢失了我刚刚设置的属性。如果我在这方面是正确的,那么什么时候是使用presentedViewController 属性的合适时间?显然我不会在我的第二个视图控制器上使用这个属性,因为我可以直接访问这个类。

4

1 回答 1

0

看一下. _ UIStoryboardSegue它有几个我认为对你非常有用的属性。

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. 这是一个例子。

你有一堆类都有相同的父级。SubViewController1, SubViewController2SubViewController3它们都是 的子类,MyViewController你现在可能有也可能没有。所以你想检查它是否存在并告诉它完成它正在做的事情并离开。令人高兴的是,有一种方法MyViewController可以让你做到这一点。

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

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

于 2013-02-14T19:32:54.657 回答