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

我目前有一个导航控制器,包含一个视图控制器和两个表视图控制器。 当用户导航到第二个表格视图控制器时,他们可以按下一个“+”barbutton项目,这个button项目用一个包含文本字段的静态单元模式地呈现另一个表格视图。 用户可以input文本并按'完成'来保存。 当我的委托方法被调用时,视图控制器被closures,用户input的string被追加到第二个视图控制器中的数组。 表格视图然后在表格单元格中显示用户input的文字。 数组已经通过prepareForSegue方法传递给堆栈。 这是目前正在工作,因为我可以看到在第一个视图控制器中的数组实例化的表视图中的string。

当用户在第二个表视图(包含单元格中显示的用户input的string)之前导航返回到任何视图控制器时,会发生此问题。 我已经成功地将数据传递给前一个视图控制器,但经过大量研究和testing后,我无法成功获取用户input的string。 当我导航到先前的视图控制器,然后返回到第二个表视图时,用户input的数据不见了,数组只包含初始数据。

我明白,在Swift中的数组是结构和值传递到堆栈时被复制。 这对于为什么用户input的数据在导航到前一个视图控制器时消失是有意义的。 以前的视图控制器实际上不包含用户input的数据。 这是否意味着我需要将string追加到初始视图控制器中的数组而不是第二个表视图控制器中的数组? 如果是这样的话,我不确定如何从第三个视图控制器访问初始视图控制器。

我所访问的所有文档和教程都是基于将数据从当前视图控制器传递回先前的视图控制器,该视图控制器是委托人,然后closures接受input的视图控制器。

我怎样才能将用户input的string从最后一个视图控制器返回到初始视图控制器?

实际上,目标C中有很多消息传递机制,除了Phillip的答案,我build议你使用NSNotificationCenter ,通过它你可以发布通知并在需要的时候捕获它们。 发布的通知可以有自定义对象,string在你的情况下,和名称,你应该添加观察员为了接收通知。

注册特定通知:

 [[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 } 

此外,你应该删除观察员的通知,当你完成。 希望这是有帮助的。 祝你好运!

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

控制器之间没有更多的数据依赖性,必须找出交换的内容。

你可以做的是将firstViewController作为parameter passing给SecondViewContorller的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 } } 

这是一个最不切实际的方法之一。 我build议你了解导航视图控制器 。 做这样的事时,他们就像一个魅力一样工作。 请投票,如果我帮助,请打勾。