1

我目前有两个视图控制器,我通过故事板 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 方法?这样做的推荐方法是什么?

4

3 回答 3

4

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

@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.
}
于 2013-11-07T19:47:45.613 回答
3

您可以将详细控制器的引用传递给主视图控制器(即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中的地址时,它会这样做:

[_master updateAddressString:updatedAddress];
于 2013-11-07T19:33:48.930 回答
1

您可以创建一个代表模型对象的类,其属性对应于 SettingsViewController 中的字段。

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

于 2013-11-07T19:30:29.103 回答