1

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

4

2 回答 2

4

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

有关详细信息,请参阅View Controller Programming Guide中的在触发 Segue 时配置目标控制器以获取有关如何在第二个视图控制器中设置属性的信息(在这种情况下,该属性将是指向第一个控制器的弱指针). 然后,正如 Srikanth 所说,第二个控制器可以使用该指针来更新第一个控制器中的属性。prepareForSegue

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属性来更新 this favoriteColor,如下所示:

self.firstViewController.favoriteColor = @"Blue";

清楚地:

  1. FirstViewController和替换SecondViewController为适当的类名;

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

  3. 确保您在 Interface Builder 中为从第一个控制器到第二个控制器的 segue 指定了一个 segue 标识符,并调整prepareForSegue上述内容,替换YourSegueIdentifierHere为您的标识符。


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

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

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

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


顺便说一句,您使用了术语“父”和“子”,但我想澄清一下,我假设您不是在谈论更高级的视图控制器包含主题,其中视图控制器正在调用其他视图控制器以促进单个信息屏幕的呈现(而不是在应用程序中的不同场景之间转换)。正如 rdelmar 在我们下面的评论中指出的那样,严格来说,术语“父”和“子”控制器更恰当地暗示了一个正在使用视图控制器包含。

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

于 2012-12-11T22:44:15.787 回答
1

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

一旦您可以访问子视图控制器中的父视图控制器,您就可以访问其方法或属性。

于 2012-12-11T21:57:17.627 回答