Objective-C Storyboards Segue - 将数据从目标传递回sourceViewController

时间:2013-11-07 19:18:52

标签: ios objective-c storyboard uistoryboard uistoryboardsegue

我目前有两个视图控制器,我通过storyboard segue(导航控制器)将它们连接起来。当用户按下第一视图上的按钮时,屏幕转到第二视图。在第二个视图中,有文本字段,以便用户可以编辑详细信息。当我按下后退导航按钮时,如何将第二个视图控制器中的详细信息传递回第一个视图控制器?

我使用此代码将数据从第一个视图控制器发送到第二个视图控制器

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    SettingsViewController *settingsViewController = [segue sourceViewController];
    [settingsViewController setAddressString:[self addressString]];
    NSLog(@"Settings address string of SettingsViewController to: %@", [self addressString]);
}

我现在想到的将数据从第二个视图控制器传递到第一个视图控制器的唯一方法是覆盖第二个视图控制器的viewWillDisappear方法。但有没有一种方法可以使用segue方法?建议的方法是什么?

3 个答案:

答案 0 :(得分:3)

你可以使用委托。 在第二个视图控制器头文件中,您必须创建一个委托方法。

@protocol SettingsDelegate <NSObject>
- (void)userHasCompletedSettings:(NSArray *)userSettings;
@end 

@interface SettingsViewController : UIViewController
@property id<SettingsDelegate>delegate;
// Any other properties you have
@end

在第一个视图控制器中调用你的segue时,你将委托设置为self。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    SettingsViewController *settingsViewController = [segue sourceViewController];
    [settingsViewController setAddressString:[self addressString]];
    NSLog(@"Settings address string of SettingsViewController to: %@", [self addressString]);
    settingsViewController.delegate = self;
}

在第二个视图控制器中,您需要调用该方法。您可以实现自己的“后退”按钮,以便设置IBAction来调用委托方法。

- (IBAction)backButtonPressed:(id)sender
{
    // Package up your settings details in the array
    [self userHasCompletedSettings:arrayOfMySettings];
    [self dismissViewControllerAnimated:YES completion:nil];
}

您还需要设置backButtonPressed操作的方法以在第一个视图控制器上调用。

-(void)userHasCompletedSettings:(NSArray *)userSettings
{
    // Do what you need to do with the settings.
}

答案 1 :(得分:2)

您可以将详细控制器传递给主视图控制器(即self),并让它调用方法来设置结果。

例如,您可以这样做:

@interface MasterController : UIViewController
-(void)updateAddressString:(NSString*) address;
@end

@interface DetailController : UIViewController
-(void)setAddressString:(NSString*) address;
@property (nonatomic, readwrite) MasterController *master;
@end

现在你可以这样写:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    SettingsViewController *settingsViewController = [segue sourceViewController];
    [settingsViewController setAddressString:[self addressString]];
    [settingsViewController setMaster:self];
    NSLog(@"Settings address string of SettingsViewController to: %@", [self addressString]);
}

DetailController需要更新主服务器中的地址时,它会执行以下操作:

[_master updateAddressString:updatedAddress];

答案 2 :(得分:1)

您可以使用与SettingsViewController中的字段对应的属性创建表示模型对象的类。

您可以在prepareForSegue方法中创建它并传递给SettingsViewController,并将其分配给当前viewController的property / ivar。因此,您在两个viewControllers之间共享了一个模型对象实例。在字段中输入信息时 - 将其分配给自定义模型对象属性。 您的第一个viewContoller可以从共享模型对象的属性中获取信息。