如何在不使用segues的情况下将数据从第二个视图传递到第一个视图?

时间:2015-12-29 12:55:44

标签: ios objective-c

我想将字符串数据从第二个视图传递到第一个视图。 我的第一个视图包含一个包含4行的UITableView。如果用户以编程方式点击第一行,我会推送一个新的视图控制器。 例如:

 if(indexPath.row == 0)
{
    UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"NewView"];
    [self.navigationController pushViewController:controller animated:YES];
}

我的第二个视图是tableviewController,其中用户可以从第二个视图中选择任何一个应该传递给第一个视图的选项。

没有特殊的后退按钮;因为我使用了导航控制器,所以我得到导航后退按钮。 因此,当用户按下导航后退按钮时,第二个视图中的数据应该传递给第一个视图。

4 个答案:

答案 0 :(得分:0)

有多种方法可以做到这一点。

  1. 您可以使用NSUserDefaults存储数据。

  2. 您可以使用Delegate Methods

答案 1 :(得分:0)

我建议不要使用NSUserDefaults,因为您不需要持久行为,您希望处理2个对象之间的消息传递。 NSUserDefaults旨在支持基于用户偏好的自定义。请参阅以下文档中的代码段。

我会推荐代表团,因为它是Apple代码中使用的设计模式,对您来说非常有益!

  

NSUserDefaults类为其提供编程接口   与默认系统交互。默认系统允许   应用程序以自定义其行为以匹配用户的首选项。   例如,您可以允许用户确定哪些单位   测量您的应用程序显示或文档的频率   自动保存。应用程序通过分配记录此类首选项   值为用户默认数据库中的一组参数。该   参数被称为默认值,因为它们是常用的   确定应用程序在启动时的默认状态或其行为方式   默认情况下。

有很多方法可以解决这个问题。

  1. 在第二个视图中创建一个弱实例变量,该变量引用第一个视图并使用它来将数据传递到第一个视图:weak ViewController* firstView。请记住添加实例变量以将数据捕获到firstView。 这有效但引入了视图之间的紧密耦合。它们现在彼此依赖以满足所需的功能。

    if (indexPath == 0) {
        UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"NewView"];
        MyController *myController = (MyController *)controller;
        myController.firstView = self;
        [self.navigationController pushViewController:controller animated:YES];
    }
    
  2. 使用块作为完成处理程序,第二个视图可以在选择了相关数据后使用调用。在secondView上定义一个块。现在在if语句中设置完成处理程序块o secondView。现在,当选择数据时,请调用完成处理程序块。

  3. 使用delegate pattern并为secondView定义委托协议和委托属性。 firstView将实现委托协议。因此,当收集数据时,您将调用第二个视图。

    [delegate SecondViewDidCollectData:myData];

  4. SecondView上的属性

    @property (weak, nonatomic) id<SecondViewDelegate> delegate;
    

    在SecondView标头中定义的委托协议。

    // define the protocol for the delegate
    @protocol SecondViewDelegate 
    
    // define protocol functions that can be used in any class using this delegate
    -(void)SecondViewDidCollectData:(NSData *)data;
    
    @end
    

答案 2 :(得分:-1)

您可以通过以下方式实现此目的;

  1. 您可以使用NSUserDefaults存储数据。
  2. 您可以传递如下数据:

    yourViewController *vc = [[YourViewController  alloc]init];     
    vc.xyzString = "yourStringToPass";
    [self.navigationController popToViewController: vc animated:YES];
    
  3. 希望这会有所帮助。

答案 3 :(得分:-2)

tableView didSelectRowAtIndexPath 方法中添加以下代码。

 [self.navigationController.viewControllers enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    if([obj isKindOfClass:[firstViewController class]]) {
        firstViewController *objfirstViewController = obj;

        objfirstViewController.xyzString = "yourString";

        [self.navigationController popToViewController: objfirstViewController animated:YES];
        *stop = YES;
    }
}];