使用最简单的方法将数据(字符串)从子VC传递到父VC

时间:2012-12-11 21:55:21

标签: objective-c ios

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

2 个答案:

答案 0 :(得分:4)

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

有关详细信息,请参阅 View Controller编程指南中的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文件执行第一个视图控制器的#import .h;以及

  3. 确保您已在Interface Builder中为第一个控制器和第二个控制器中的segue指定了segue标识符,并调整上面的prepareForSegue,将YourSegueIdentifierHere替换为您的标识符。< / p>


  4. 在iOS 6中,您还可以通过展开segue来完成此操作。您只需让第二个视图控制器的prepareForSegue更新展开segue的目标控制器(即第一个控制器)的属性。有什么好处的是,展开segue可以返回任意数量的级别,因此对于更复杂的场景,它非常好。但它只是iOS 6或更高版本。

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

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

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


    顺便说一句,你使用的是“父母”和“孩子”这两个词,但我想说清楚我认为你不是在谈论view controller containment更高级的话题,其中有一个观点控制器正在调用其他视图控制器以便于呈现单个屏幕信息(而不是在应用程序中的不同场景之间转换)。正如rdelmar在下面的评论中指出的那样,严格来说,术语“父”和“子”控制器更恰当地暗示一个人正在使用视图控制器包含。

    显然,如果您正在使用视图控制器包含,那么显然对segues prepareForSegue等的讨论不适用。此外,正确实现的容器视图控制器可确保子控制器实际上可以使用UIViewController的{​​{1}}属性,而无需定义我们自己的属性来引用父级。您需要做的就是将parentViewController转换/定义为正确的子类,然后您可以非常轻松地访问子类属性。

答案 1 :(得分:1)

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

在子视图控制器中访问父视图控制器后,您可以访问其方法或属性。