通常,如果我想将信息发送到我正在导航到的 View Controller ,我只需在 prepareForSegue 函数中指定它,如下所示:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
let vc = segue.destinationViewController as! SomeViewController
vc.info = self.info
}
但据我所知,这仅在我创建要导航到的 View Controller 的新实例时有效。
假设我在导航栏中有一个按钮,它有一个(显示)segue 到另一个 View Controller ,我想在弹出它或按下后退按钮后保留我在新 View Controller 中的数据。这样做的最佳做法是什么?我不确定如何创建对父 View Controller 的引用。现在我只是将我需要的信息存储在全局变量中,但如果感觉很不对。
我正在做的事情的简单例子:
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
}
两个 Controller 通过 Storyboard连接
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 新手,我不知道这种情况下的最佳做法。如果我问一个重复的问题,请原谅我。我不太了解术语,所以我不确定要搜索什么。
最佳答案
有很多方法可以解决这个问题。
如果你有一个导航 Controller 并且你正在做一个 show segue,然后当你完成时弹出,并且你正在将信息从源传递到目的地(就像在主/细节设计中)那么它确实使在 prepareForSegue 中传递信息是有意义的。
您可以通过引用传递数据对象,并让源 View Controller 保留对该数据对象的引用。然后当源 View Controller 的 viewWillAppear 方法触发时,您可以检查数据对象的变化并采取相应的行动。
您还可以使用委托(delegate)属性设置目标 View Controller ,并使源 View Controller 成为目标的委托(delegate)。定义目标 View Controller 用于与其委托(delegate)通信的协议(protocol)。
然后在目标 View Controller 中,您可以向委托(delegate)发送消息以告知它用户所做的更改。
如果您处理的数据对您的应用具有全局意义,那么使用某种应用范围的共享数据存储是合理的。在这种情况下,我可能会使用数据容器单例。
哪种方法最好实际上取决于您的 View Controller 正在做什么以及数据在您的应用设计中意味着什么。
关于ios - 使用导航 Controller 处理数据持久性/流的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31030928/