如何在Swift / XCode中的控制器之间共享(MVC)模型?

时间:2014-06-05 08:05:44

标签: objective-c xcode swift

我目前正在创建我的第一个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本身。

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

2 个答案:

答案 0 :(得分:0)

根据数据模型的复杂程度,需要考虑以下事项:

  1. 对于复杂数据模型,请考虑使用Core Data
  2. 创建一个单独的DataController类,使您可以从应用程序中的任何控制器访问模型。在Swift中可以这样做:Using a dispatch_once singleton model in Swift
  3. 您只能将用户界面用于XIB /故事板,绝不会用于您的模型。

答案 1 :(得分:-1)

我首先想要创建模型,然后将它们传递到每个视图的初始化代码中,这与您在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函数及其精确的args。