我正在构建应用并尝试使用MVVM模式。虽然有大量关于如何将数据连接起来以形成模型到视图模型到控制器到视图的信息,但我很难学习如何做其他事情。同时坚持MVVM原则。我真正挣扎的一件事是在切换到不同的视图控制器之后设置两个被管理对象之间的关系。让我解释一下......
当我的应用程序启动时,它会显示第一个视图控制器,该视图控制器由视图模型支持,该视图模型与新创建的NSManagedObject
LiftEvent
类型进行对话。从这里,用户可以转到设置视图控制器,该控制器也具有视图模型,并从那里他们可以转到表视图,该视图也具有视图模型,并进行需要更改{{1}的选择模型对象的属性。此属性是与另一个NSManaged var
的关系。这是流程:
我将NSManagedObject
从第一个视图控制器传递到设置视图控制器:
managedObjectContext
然后再将它传递给用户进行选择的最后一个视图控制器,我想设置关系。它有效,但我不喜欢它,因为我现在必须在视图控制器中override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let nav = segue.destinationViewController as? UINavigationController {
let vc = nav.topViewController as! SettingsViewController
vc.dismissalDelegate = self
let moc = viewModel.model.context
vc.moc = moc
}
传递它。
最右边的视图控制器是import CoreData
。当用户选择其中一行时,我想使用该选择来获取相应的托管对象,并将其设置为应用程序启动时创建的对象上的一个属性。这是UITableViewController
方法:
didSelectRowAtIndexPath
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
tableView.deselectRowAtIndexPath(indexPath, animated: true)
let defaultFormula = NSUserDefaults.formula()
guard indexPath.row != defaultFormula.rawValue else { return }
if let newDefaultFormula = FormulaName(rawValue: indexPath.row) {
NSUserDefaults.setDefaultFormulaName(newDefaultFormula)
}
if let selectedFormula = formulasArray[indexPath.row] {
// now what?
}
}
是可能名称的枚举。数据源为FormulaName
,是formulasArray
个托管对象的数组。我在Formula
中初始化数组:
viewDidLoad
我在脑海中看到了一些可能的解决方案,但我不知道它们中的哪一个(如果有的话)是不错的选择:
override func viewDidLoad() {
super.viewDidLoad()
formulasArray = dataManager.fetchSelectableFormulas(moc)
}
,设置关系,然后告诉第一个视图控制器的视图模型,该对象已更改。LiftEvent
对象的引用,而不是只传递LiftEvent
属性我花了无数个小时试图找到示例,课程,git存储库,SO线程等来解决这个问题,我不知道从哪里开始。我并没有要求任何人为我编写代码,只是引导我朝着一个好的方向前进,我将永远感激。
答案 0 :(得分:0)
我也遇到过在iOS中找到MVVM的具体例子的问题,所以我开发了自己的方法。
我有几条建议(这是明确的意见)。
将NSManagedObject上下文保留在CD访问单例中以便在主线程上进行访问非常有用。假设您没有在后台使用多个数据库或执行大量操作(如果需要,您可以使用访问器处理),您将拥有1个没有上下文传递的上下文。
使用Segues时,依赖注入非常棒。而不是为您的新VC提供查找数据和设置所需的最少信息,只需在Segue中设置它的ViewModel并构建VC即可。这就是使ViewModel运行良好的原因。您的View / ViewController不需要知道关于您的模型的任何。
在处理unwind时,我的方法是简单地制作一个" selectedItem"所需VC中的属性,并负责向VC展开的VC做什么。如果有必要,它可以在展开时获取该值。这允许您选择VC以相同的方式操作,无论其周围的行为如何。