使用最简单的方法将数据(string)从子VC传递给父VC

使用最简单的方法将数据(string)从子视图控制器传递给父VC。 我尝试了几种方法,但是迷路了,有人能告诉我最好的方法。

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

有关详细信息,请参阅View Controller编程指南中 触发Segue时configuration目标控制器以获取有关如何在第二个视图控制器中设置属性的信息(在这种情况下,该属性将是指向第一个控制器的弱指针) 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. 用相应的类名replaceFirstViewControllerSecondViewController ;

  2. 确保你的第二个视图控制器的.m文件做了第一个视图控制器的.h的#import ; 和

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


在iOS 6中,您也可以通过展开顺序完成此操作。 您只需要第二个视图控制器的prepareForSegue更新unwind segue的目标控制器(即第一个控制器)的属性。 不错的是,放松赛可以回到任意数量的级别,所以对于更复杂的场景,这是非常好的。 不过,它只是iOS 6或更高版本。

为了展开segue,首先必须在第一个视图控制器中定义一个展开动作(通过IBAction返回types和UIStoryboardSegue参数的组合来标识),例如:

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

然后,第二个(或第三个或…)视图控制器可以通过在界面生成器中从button到场景停靠区中的退出图标进行控制 -拖拽来创build展开静止。 你可以让控制器从你正在展开逻辑prepareForSegue传递信息回到第一个视图控制器。


顺便说一下,你使用了“parent”和“child”的术语,但是我想说清楚,我认为你并不是在讨论视图控制器遏制更高级的主题,其中视图控制器正在调用其他视图控制器来帮助呈现单个屏幕的信息(而不是在应用中的不同场景之间转换)。 正如rdelmar在我们下面的评论中指出的那样,严格来说,“父”和“子”控制器这两个术语更恰当地暗示着正在使用视图控制器控制。

显然,如果你正在使用视图控制器遏制,那么显然讨论segues, prepareForSegue等不适用。 此外,一个正确实现的容器视图控制器保证了子控制器实际上可以使用parentViewControllerUIViewController属性,而不需要定义我们自己的属性来引用父对象。 所有你需要做的就是投入/定义parentViewController是正确的子类,然后你可以很容易地访问你的子类。

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

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