【问题标题】:Objective-C Storyboards Segue - Passing data from destination back to sourceViewControllerObjective-C Storyboards Segue - 将数据从目的地传回 sourceViewController
【发布时间】:2013-11-19 14:48:36
【问题描述】:

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

【问题讨论】:

    标签: ios objective-c storyboard uistoryboard uistoryboardsegue


    【解决方案1】:

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

    @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.
    }
    

    【讨论】:

      【解决方案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中的地址时,它会这样做:

      [_master updateAddressString:updatedAddress];
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 感谢您的快速答复。你的意思是像单例模型对象吗?
        • 它可能是单例或简单对象,但它的实例应该在两个视图控制器之间共享(例如:@property (strong, nonatomic) CustomModelObject *obj;)执行 segue 或返回。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-05
        • 1970-01-01
        • 2020-12-07
        • 2014-02-18
        • 2018-01-06
        • 2016-07-25
        • 2013-08-30
        相关资源
        最近更新 更多