我有3个类:MyProfileVC,NewProfileVC和NewProfileViewModel。 为了使我的测试编写更容易,我决定在我的最后两个类中创建初始化器,如下所示:
NewProfileViewController:
var user: Users
var viewModel: NewProfileViewModel
init(for user: Users, with coreDataStack: CoreDataStack) {
self.user = user
self.viewModel = NewProfileViewModel(for: user, with: coreDataStack)
super.init(nibName: nil, bundle: nil)
}
其中NewProfileViewModel
有自己的init:
var user: Users
var coreDataStack: CoreDataStack
init(for user: Users, with coreDataStack: CoreDataStack) {
self.user = user
self.coreDataStack = coreDataStack
}
最后,我尝试将它们初始化为MyProfileViewController
中的链:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "toNewProfile" {
var viewController = segue.destination as! NewProfileViewController
viewController = NewProfileViewController(for: sender as? Users ?? Users(context: coreDataStack.mainContext), with: coreDataStack)
}
}
因此,这会初始化我的NewProfileVC
,而NewProfileVC
会初始化NewProfileViewModel
。
但是我想问一下开发人员的经验比我更高,以这种方式初始化prepare: for segue
内部的VC是一种很好的做法,或者你能给我更好的想法吗?
我不想写代码只是简单的工作,但想要建立一个好的架构,我没有任何导师问他,所以唯一的地方是Stack,我希望你能帮助我。
提前谢谢!
答案 0 :(得分:1)
您应该 初始化prepareForSegue
中的新视图控制器。
purpose of this method 配置新视图控制器在显示之前。 (重点补充)。
segue为您提供初始化的目标视图控制器。使用此实例非常重要,以便您在故事板中定义的所有插座和操作都已正确设置。对于以您显示的方式初始化的视图控制器,情况并非如此。
要将数据传递给视图控制器,请在NewProfileViewController
中将数据变量定义为选项:
var user: Users?
var viewModel: NewProfileViewModel?
并将其设置为prepareForSegue
:
if segue.identifier == "toNewProfile" {
var viewController = segue.destination as! NewProfileViewController
var user = Users ?? Users(context: coreDataStack.mainContext)
viewController.user = user
viewController.viewModel = NewProfileViewModel(for: user, with: coreDataStack)
}
对此的一个可能的改进是在视图控制器中添加和调用一个方法,该方法获取所需的所有数据:
if segue.identifier == "toNewProfile" {
var viewController = segue.destination as! NewProfileViewController
var user = Users ?? Users(context: coreDataStack.mainContext)
viewController.configureOnSegue(user: user, viewModel: NewProfileViewModel(for: user, with: coreDataStack))
}
添加的视图控制器方法如下所示:
func configureOnSegue(user: Users, viewModel: NewProfileViewModel) {
self.user = user
self.viewModel = viewModel
}