2012-12-11 14 views

回答

4

Srikanth是正确的。如果你有一个从视图控制器(我们的“第一个”视图控制器)到另一个视图控制器(我们的“第二个”视图控制器),你需要做的是在第二个指向第一个的属性中创建一个属性。您只需让第一个视图控制器确保在执行转换之前设置该指针。完成之后,第二个控制器可以更新属性或调用第一个控制器的方法。

有关详情,以了解如何在第二个视图控制器设置属性信息的视图控制器编程指南在看到Configuring the Destination Controller When a Segue is Triggered(在这种情况下,该属性将是一个弱指针到第一控制器)中prepareForSegue。然后,正如Srikanth所说,第二个控制器可以使用该指针更新第一个属性。

所以,在你的第二个视图控制器,有一个属性(仔细注意,它应该是weak)指回第一个视图控制器:

在SecondViewController.h:

@class FirstViewController; 

@interface SecondViewController : UIViewController 

@property (nonatomic, weak) FirstViewController *firstViewController; 

@end 

然后在FirstViewController.m:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"YourSegueIdentifierHere"]) 
    { 
     [segue.destinationViewController setFirstViewController:self]; 
    } 
} 

所以,如果你的第一个视图控制器有,例如,favoriteColor属性:

@interface FirstViewController : UIViewController 

@property (nonatomic, strong) NSString *favoriteColor; 

@end 

然后,第二视图控制器可以利用其firstViewController属性来更新这favoriteColor,像这样:

self.firstViewController.favoriteColor = @"Blue"; 

显然:

  1. 与适当的类替换FirstViewControllerSecondViewController名称;

  2. 确保您的第二个视图控制器的.m文件执行第一个视图控制器的.h文件的#import;和

  3. 确保您已在Interface Builder中为第一个控制器指定了一个segue标识符,然后调整上面的prepareForSegue,用您的标识符替换YourSegueIdentifierHere


在iOS 6中,您还可以通过回卷SEGUE做到这一点。您只需让第二个视图控制器的prepareForSegue更新unwind segue的目标控制器(即第一个控制器)的属性。不错的是,放松赛段可以回到任意数量的级别,所以对于更复杂的场景,这是非常好的。不过,它只是iOS 6或更高版本。

要执行退绕SEGUE的,首先必须(通过IBAction返回类型的组合和UIStoryboardSegue参数确定为这样)限定在所述第一视图控制器退绕动作,例如:

- (IBAction)done:(UIStoryboardSegue *)segue 
{ 
    // do any clean up you want 
} 

然后,第二个(或第三个或...)视图控制器可以通过控制创建展开顺序 - 在界面构建器中从按钮拖动到场景底座中的退出图标。您可以让您从中退出的控制器执行逻辑prepareForSegue以将信息传递回第一个视图控制器。


顺便问一下,你所使用的术语“家长”和“孩子”,但我想说清楚,我以为你不是在谈论的view controller containment更高级的话题,其中一个视图控制器正在调用其他视图控制器以便于呈现单个屏幕的信息(而不是在应用中的不同场景之间进行转换)。正如rdelmar在我们下面的评论中指出的那样,严格来说,术语“父”和“子”控制器更恰当地暗示着使用视图控制器控制。

显然,如果您使用视图控制器遏制,那么明确讨论segues,prepareForSegue等,不适用。此外,正确实施的容器视图控制器保证子控制器实际上可以使用parentViewController的属性,而无需定义我们自己的属性来引用父项。您只需要将parentViewController投射/定义为正确的子类,然后就可以非常轻松地访问您的子类。

+0

没有必要创建一个属性,孩子已经拥有了属性parentViewController,它将指向父级。 – rdelmar

+0

@rdelmar我不认为你的意思是'parentViewController',因为这给你视图控制器遏制的父母。例如,如果你正在做模态转换,你可以使用'presentationViewController',但根据我的经验,如果你正在做模态转换的视图控制器本身就嵌入在导航控制器中,那么即使这样也行不通。如果你正在进行push segges,那么'parentViewController'和'presentingViewController'都不能工作。 (叹气。)这就是为什么我自己指定了“parent”(为什么我没有把它叫做'parentViewController',以避免混淆)。 – Rob

+0

是的,我的意思是parentViewController,因为问题具体询问父子关系。现在,OP很可能错误地使用了这个术语,在这种情况下,你的方式是必要的(也是更一般的)。 – rdelmar

1

最好的方法是在类型为id或UIViewController的子视图控制器中拥有一个属性。在创建子项时将该值设置为父视图控制器。

一旦你有权访问子视图控制器中的父视图控制器,你可以访问它的方法或属性。

+0

你能否给我提供一些教程链接或任何东西。 –

+0

@AkshatAnil:我真的怀疑这个教程的具体内容是“将一个数据从一个子视图控制器传递给父视图控制器。你不知道如何创建属性或者什么? – Chuck

+0

是的,在我的情况下没有工作的原因,我试图使用协议和委托。 –

相关问题