通常,如果我想向我导航到的视图控制器发送信息,我只需在prepareForSegue函数中指定它,如下所示:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
let vc = segue.destinationViewController as! SomeViewController
vc.info = self.info
}
但据我所知,这仅在我创建正在导航到的视图控制器的新实例时才有效。
假设导航栏中有一个按钮,其中有一个(显示)segue到另一个视图控制器,我想在弹出它或按下后退按钮后保留新视图控制器中的数据。这样做的最佳做法是什么?我不确定如何创建对父视图控制器的引用。现在我只是在全局变量中存储我需要的信息,但是如果感觉非常错误的话。
我正在做的事情的简单例子:
var globalInfo:Int?
class FirstViewController: UIViewController {
//this view controller is connected to SecondViewController via a navigation
//item that I created in the UI builder. It is a "show" segue
//other code
}
两个控制器通过故事板连接
class SecondViewController: UIViewController {
//code
//code
func doWork {
globalInfo = 0 // this is the global variable specified in the first view controller
}
//so now when I push back, globalInfo will still be set to 0.
}
我知道这不是管理数据流的好方法,但我是iOS的新手,我不知道这种情况下的最佳做法。如果我问一个重复的问题,请原谅我。我不太了解术语,所以我不确定要搜索什么。
答案 0 :(得分:2)
有很多方法可以解决这个问题。
如果您有一个导航控制器,并且您正在进行show segue,那么当您完成时会弹出一个弹出窗口,并且您正在将信息从源传递到目标(如在主/详细设计中)然后它在prepareForSegue中传递信息确实有意义。
您可以通过引用传递数据对象,并让源视图控制器保持对该数据对象的引用。然后当源视图控制器'触发viewWillAppear方法,您可以检查数据对象的变化并采取相应的行动。
您还可以使用委托属性设置目标视图控制器,并使源视图控制器成为目标的委托。定义目标视图控制器用于与其委托进行通信的协议。
然后,在目标视图控制器中,您可以向代理发送消息,告诉它有关用户所做的更改。
如果您正在处理的数据对您的应用具有全局意义,则使用某种应用范围的共享数据存储是合理的。在这种情况下,我可能会使用数据容器单例。
什么方法最好取决于您的视图控制器正在做什么以及数据在您的应用设计中意味着什么。
答案 1 :(得分:1)
您可以通过多种方式将数据从一个类继承到另一个类,并且它们各有利弊。一些最常见的是:
关键值观察
KVO是Apple的最爱之一,可以非常强大。它允许对象监视对其他对象属性的更改,并在发生这些更改时作出适当的反应。很多很棒的教程,我已经链接了Apple的KVO指南和我在开始时发现的NSHipster教程。
NSHipster:http://nshipster.com/key-value-observing/
<强> NSNotificationCenter 强>
NSNotificationCenter允许对象广播可以由任何其他关心侦听的对象监听的通知。它没有KVO那么具体,当你不知道它来自哪里或者谁需要它时,它可以用来传输数据。这个链接很好地比较了KVO和NSNotificationCenter。
NSHipster:http://nshipster.com/nsnotification-and-nsnotificationcenter/
还有其他各种方法,包括委托和回调,但这肯定会让你开始!当你遇到你不了解的概念时,请查看nshipster.com,当然还有Apple的文档,以获得丰富的开端资源。