【问题标题】:How to share (MVC) model between controllers in Swift / XCode?如何在 Swift / XCode 中的控制器之间共享(MVC)模型?
【发布时间】:2014-06-05 08:05:43
【问题描述】:

我目前正在创建我的第一个 Swift / Mac 应用程序,但我遇到了在多个控制器之间共享模型(在 MVC 意义上)的问题。

例如,在 C# 中,首先创建一个模型,然后创建多个视图模型,然后将该模型插入其中,如下所示:

var gameEngine = new MyGameEngine()
var vm1 = new ViewModelCockpit(gameEngine);
var vm2 = new ViewModelOptionsDialog(gameEngine);

但是,在 XCode 中,我的控制器似乎应该放入 .xib 中,而这些控制器又会自动实例化。

鉴于 Swift 的语言特性和 XCode/Objective-C 现有标准,最好和最专业的方式是拥有多个可以从多个控制器共享和访问的 重量级 模型? (重量级,因为它们需要一些时间、内存或复杂的逻辑/依赖项)来加载,并且可能不容易放入 .xib 本身。

可能的答案可能是:全局变量、一些魔法/静态属性……理想情况下,解决方案应该在软件工程意义上感觉可靠,并采用 Swift 的语言特性考虑到。

【问题讨论】:

  • 你从哪里得到“新”的?此外,下载 WWDC 应用程序并观看视频。这就是我们目前正在学习的方式。
  • 上面的新 X() 是您在 C# 中的操作方式。我正在寻找 XCode / IB / Swift 中一般问题的等效解决方案。

标签: objective-c xcode swift


【解决方案1】:

根据您的数据模型的复杂程度,需要考虑以下几点:

  1. 对于复杂的数据模型,请考虑使用 Core Data
  2. 创建一个单例 DataController 类,让您可以从应用程序中的任何控制器访问您的模型。在 Swift 中可以这样完成:Using a dispatch_once singleton model in Swift

您只将 XIBs/Storyboards 用于 UI,从不用于您的模型。

【讨论】:

    【解决方案2】:

    我喜欢先创建模型,然后将它们传递到每个视图的初始化程序代码中,这与您在 C# 中描述的非常相似。这也类似于在 JavaScript 中执行此操作(例如,在 Backbone JS 中)。

    let gameEngine = MyGameEngine()
    
    
    let vm1 = ViewModelCockpit(nibName: "ViewModelCockpit", bundle: NSBundle.mainBundle(), gameEngine: gameEngine)
    let vm2 = ViewModelOptionsDialog(nibName: "ViewModelOptionsDialog", bundle: NSBundle.mainBundle(), gameEngine: gameEngine)
    
    class ViewModelCockpit: NSViewController {
      var myGameEngineModel: GameEngineModel
    
      init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!, myGameEngineModel: GameEngineModel) {
        self.myGameEngineModel = myGameEngineModel
    
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
      }
    }
    

    注意——你必须调用父类的super.init(),如果你忘记了,Xcode 会很好地提醒你!我使用 Xcode 的自动补全功能为我提供常用的 init 函数及其确切的参数。

    【讨论】:

      猜你喜欢
      • 2012-02-16
      • 1970-01-01
      • 2019-03-23
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      • 2014-08-11
      • 1970-01-01
      • 2017-07-16
      相关资源
      最近更新 更多