2013-02-14 48 views
2

假设我正在使用segues转换视图控制器。我在View Controller 1上有一个textField,在第二个视图控制器上有一个标签。当我segueing到第二视图控制器我可以很容易地设置标签用下面的代码:何时适合使用presentedViewController?

视图控制器#2

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

这是非常合情合理的。 presentViewController属性在这种情况下被使用。虽然试图找出当presentedViewController属性将被用它似乎是合乎逻辑,它会从第一个视图控制器在prepareForSegue方法中使用这样的:

视图控制器#1

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

尽管如此,这并不似乎工作,我假设这是因为在prepareForSegue中,第二个视图控制器的新实例在segue发生之前被调用,因此失去了我刚刚设置的属性。如果我在这是正确的,什么时候使用presentViewController属性是适当的时间?很明显,我不会在我的第二个视图控制器上使用这个属性,因为我可以直接访问这个类。

回答

0

看看class referenceUIStoryboardSegue。它有一些我认为对你非常有用的属性。

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,SubViewController2,SubViewController3,它们都是MyViewController的子类,你现在可能有也可能没有。所以你想检查它是否存在,并告诉它完成它正在做什么并离开。令人高兴的是,在MyViewController上有一个方法可以让你做到这一点。

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

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