假设我正在使用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属性?显然我不会在我的第二个视图控制器上使用这个属性,因为我可以直接访问该类。
答案 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
的引用。这是一个例子。
你有很多类都有相同的父级。 SubViewController1
,SubViewController2
,SubViewController3
这些都是MyViewController
的子类,您现在可能也可能没有。所以你想检查它是否存在并告诉它完成它正在做什么并离开。令人高兴的是,MyViewController
上有一种方法可以让你做到这一点。
if (self.presentedViewController) {
MyViewController *subVC = (MyViewController *)self.presentedViewController;
[subVC finishAndGoAway];
}
这只是您可以使用它的一个示例。在许多其他情况下它会很有用,但也有很多时候它完全没有意义,因为你已经有了一些参考,所以你不需要使用默认的。