如何将数据从第三视图控制器传递回第一视图控制器?

时间:2014-12-12 01:24:56

标签: ios swift

我目前有一个导航控制器,它包含一个视图控制器和两个表视图控制器。当用户导航到第二个表格视图控制器时,他们可以按下' +' + bar按钮项,它以模态方式显示另一个表视图,其中包含一个包含文本字段的静态单元格。用户可以输入文字并按“完成”。保存它。调用我的委托方法时,视图控制器将被关闭,并且用户输入的字符串将附加到第二个视图控制器中的数组。然后,表视图在表格单元格中显示用户输入的文本。数组已通过prepareForSegue方法向上传递。这当前有效,因为我可以在表视图中看到数组在第一个视图控制器中实例化的字符串。

当用户在第二个表视图之前向下导航到任何视图控制器时,会出现问题,第二个表视图包含在单元格中显示的用户输入的字符串。显然,我已成功将数据传递给上一个视图控制器,但经过大量研究和测试后,我无法成功获取用户输入的字符串。当我导航到先前的视图控制器然后返回第二个表视图时,用户输入的数据消失了,并且数组仅包含初始数据。

我理解Swift中的数组是结构,并且在向上传递堆栈时会复制值。当我导航到先前的视图控制器时,这对于用户输入的数据消失的原因是有意义的。以前的视图控制器实际上不包含用户输入的数据。这是否意味着我需要将字符串附加到初始视图控制器中的数组而不是第二个表视图控制器中的数组?如果是这种情况,我不确定如何从第三个视图控制器访问初始视图控制器。

我访问过的所有文档和教程都是基于将数据从当前视图控制器传递回先前的视图控制器,该视图控制器随后解除接受输入的视图控制器。

如何将用户输入的字符串从最后一个视图控制器传递回初始视图控制器?

3 个答案:

答案 0 :(得分:2)

实际上,Objective C中有很多消息传递机制,除了Phillip的回答之外,我建议您使用NSNotificationCenter使用哪些可以发布通知并在需要时捕获它们。发布的通知可以包含自定义对象,您的案例中的字符串以及名称,您应该为其添加观察者以接收该通知。

注册特定通知:

[[NSNotificationCenter defaultCenter] addObserver:{object_to_handle_notification} selector:@selector(notificationReceived:) name:@"my_notification" object:nil];

发布通知

[[NSNotificationCenter defaultCenter] postNotificationName:@"my_notification" object:userEnteredString];

处理通知:

- (void)notificationReceived:(NSNotification *)notification
{
    NSString *userEnteredString = notification.object;
    //do whatever you want with the user entered string
}

此外,完成后,您应该删除观察者的通知。 希望这有用。祝你好运!

答案 1 :(得分:1)

创建一个负责维护数据模型的类。您可以将其设为单例,也可以通过应用程序委托(或其他选项)使该类的对象可用。当控制器希望信息可用于应用程序的其他部分时,它会将其发送到数据模型以进行更新。当控制器想要显示信息时,它会从数据模型中获取信息。

控制器之间不再有数据依赖关系,必须找出要交换的内容。

答案 2 :(得分:0)

您可以做的是将firstViewController作为参数传递给SecondViewController的prepareForSegue方法中的ThirdViewController。

FirstViewController:

class FirstViewController: UIViewController {
  var a:String!

  override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
      var destination=segue.destinationViewController as? SecondViewController
      destination?.firstViewCont=self
    }
}

SecondViewController:

class SecondViewController: UIViewController {
  var firstViewCont:FirstViewController!

  override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
      var destination=segue.destinationViewController as? ThirdViewController
      destination?.FViewCont=self.firstViewCont
    }
}

ThirdViewController:

class ThirdViewController: UIViewController {
  var FViewCont:FirstViewController!

  @IBAction func textFieldEdited(sender: UITextField) {
         FViewCont.a!=sender.text
  }
}

这是人们最不切实际的做法之一。我建议您了解Navigation View Controllers。在做这样的事情时,它们就像一个魅力。