使用导航控制器处理数据 persistence/flow 的正确方法?
Proper way to handle data persistence/flow with navigation controllers?
通常情况下,如果我想将信息发送到我要导航到的视图控制器,我只需在 prepareForSegue 函数中指定它,如下所示:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
let vc = segue.destinationViewController as! SomeViewController
vc.info = self.info
}
但据我了解,这仅在我创建要导航到的视图控制器的新实例时有效。
假设我在导航栏中有一个按钮(显示)到另一个视图控制器,我想在弹出它或按下后退按钮后保留我在新视图控制器中的数据。这样做的最佳做法是什么?我不确定如何创建对父视图控制器的引用。现在我只是将我需要的信息存储在全局变量中,但如果感觉很不对。
我正在做的事情的简单示例:
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 的新手,我不知道这种情况下的最佳做法。如果我问一个重复的问题,请原谅我。我不太了解术语,所以我不确定要搜索什么。
有很多方法可以解决这个问题。
如果你有一个导航控制器并且你正在做一个 show segue,然后当你完成时弹出,并且你正在将信息从源传递到目的地(就像在 master/detail 设计中)那么在 prepareForSegue 中传递信息确实有意义。
您可以通过引用传递数据对象,并让源视图控制器保留对该数据对象的引用。然后当源视图控制器的 viewWillAppear 方法触发时,您可以检查数据对象的变化并采取相应的行动。
您还可以使用委托 属性 设置目标视图控制器,并使源视图控制器成为目标的委托。定义目标视图控制器用于与其委托通信的协议。
然后在目标视图控制器中,您可以向委托发送消息以告知它用户所做的更改。
如果您处理的数据对您的应用具有全局意义,那么使用某种应用范围的共享数据存储是合理的。在这种情况下,我可能会使用数据容器单例。
哪种方法最好实际上取决于您的视图控制器在做什么以及数据在您的应用程序设计中意味着什么。
有多种方法可以将数据从 class 保存到 class,它们各有利弊。一些最常见的是:
键值观察
KVO 是 Apple 的最爱之一,而且功能非常强大。它允许对象监视对其他对象属性的更改,并在发生这些更改时做出适当的反应。那里有很多很棒的教程,我已经 link 阅读了 Apple 的 KVO 指南和我在开始时发现有用的 NSHipster 教程。
NSHipster: http://nshipster.com/key-value-observing/
NSNotificationCenter
NSNotificationCenter 允许一个对象广播可以被任何其他关心监听的对象监听的通知。它不像 KVO 那样具体,可用于在您不确切知道数据来自何处或谁需要它时传输数据。 link 很好地比较了 KVO 和 NSNotificationCenter。
NSHipster: http://nshipster.com/nsnotification-and-nsnotificationcenter/
还有其他各种方法,包括委托和回调,但这绝对会让您入门!当您遇到您不知道的概念时,请查看 nshipster.com,当然还有 Apple 的文档以获得大量的入门资源。
通常情况下,如果我想将信息发送到我要导航到的视图控制器,我只需在 prepareForSegue 函数中指定它,如下所示:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
let vc = segue.destinationViewController as! SomeViewController
vc.info = self.info
}
但据我了解,这仅在我创建要导航到的视图控制器的新实例时有效。
假设我在导航栏中有一个按钮(显示)到另一个视图控制器,我想在弹出它或按下后退按钮后保留我在新视图控制器中的数据。这样做的最佳做法是什么?我不确定如何创建对父视图控制器的引用。现在我只是将我需要的信息存储在全局变量中,但如果感觉很不对。
我正在做的事情的简单示例:
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 的新手,我不知道这种情况下的最佳做法。如果我问一个重复的问题,请原谅我。我不太了解术语,所以我不确定要搜索什么。
有很多方法可以解决这个问题。
如果你有一个导航控制器并且你正在做一个 show segue,然后当你完成时弹出,并且你正在将信息从源传递到目的地(就像在 master/detail 设计中)那么在 prepareForSegue 中传递信息确实有意义。
您可以通过引用传递数据对象,并让源视图控制器保留对该数据对象的引用。然后当源视图控制器的 viewWillAppear 方法触发时,您可以检查数据对象的变化并采取相应的行动。
您还可以使用委托 属性 设置目标视图控制器,并使源视图控制器成为目标的委托。定义目标视图控制器用于与其委托通信的协议。
然后在目标视图控制器中,您可以向委托发送消息以告知它用户所做的更改。
如果您处理的数据对您的应用具有全局意义,那么使用某种应用范围的共享数据存储是合理的。在这种情况下,我可能会使用数据容器单例。
哪种方法最好实际上取决于您的视图控制器在做什么以及数据在您的应用程序设计中意味着什么。
有多种方法可以将数据从 class 保存到 class,它们各有利弊。一些最常见的是:
键值观察
KVO 是 Apple 的最爱之一,而且功能非常强大。它允许对象监视对其他对象属性的更改,并在发生这些更改时做出适当的反应。那里有很多很棒的教程,我已经 link 阅读了 Apple 的 KVO 指南和我在开始时发现有用的 NSHipster 教程。
NSHipster: http://nshipster.com/key-value-observing/
NSNotificationCenter
NSNotificationCenter 允许一个对象广播可以被任何其他关心监听的对象监听的通知。它不像 KVO 那样具体,可用于在您不确切知道数据来自何处或谁需要它时传输数据。 link 很好地比较了 KVO 和 NSNotificationCenter。
NSHipster: http://nshipster.com/nsnotification-and-nsnotificationcenter/
还有其他各种方法,包括委托和回调,但这绝对会让您入门!当您遇到您不知道的概念时,请查看 nshipster.com,当然还有 Apple 的文档以获得大量的入门资源。