我目前正在创建我的第一个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的语言功能考虑到了。
答案 0 :(得分:0)
根据数据模型的复杂程度,需要考虑以下事项:
您只能将用户界面用于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。