ios - 使用导航 Controller 处理数据持久性/流的正确方法?

标签 ios swift uinavigationcontroller

通常,如果我想将信息发送到我正在导航到的 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/

相关文章:

objective-c - 调用 popToRootViewController 动画导致崩溃。我应该怎么做?

iphone - UINavigationController 建议

ios - 如何以编程方式在 iOS 中添加 SubView?

通过 HDMI 的 iOS 音频——如何处理 48khz 采样率?

ios - 如何制作一个在 hh :mm:ss:ms 中计算的 Swift 3.0 计时器

ios - 点击文本字段时未调用 textFieldDidBeginEditing 函数

ios - UIPopoverController 内的 UINavigationController 'Back' 动画在风景中很奇怪

iphone - UIImage+Retina4 类别如果在 didMoveToSuperview 中使用则不起作用

c# - 如何将分隔符添加到 UITabbar ios

ios - UIButton 自定义背景颜色突出显示和禁用