ios实用开发技巧iOS DevelopAndroid开发经验谈

MVVM设计模式(二)

2017-12-17  本文已影响9人  Harely

View-Model的连接

连接一:用对应的 view-model 来初始化视图控制器:

MYTwitterUserProfileViewController *profileViewController = [[MYTwitterUserProfileViewController alloc] initWithViewModel: userProfileViewModel];

链接二:有时你无法在初始化时将 view-model 传入, 比如在 storyboard segue 或 cell dequeuing 的情况下. 这时你应该在讨论中的视图(控制器)中暴露一个公有可写的 view-model 属性.

MYTwitterUserCell *cell = [self. tableView dequeueReusableCellWithIdentifier: @"MYTwitterUserCell" forIndexPath: indexPath];

// grab the cell view-model from the vc view-model and assign itcell. viewModel = self. viewModel. tweets[indexPath. row];

连接三:我们可以在程序调用前传入 view-model, 比如init和viewDidLoad, 我们可以从view-model 的属性初始化所有 UI 元素的状态.


问题:

当”go” 按钮在什么时候可用了怎么办?

当用户标签和头像在什么时候从网络上下载并填充了怎么办?

当输入框改变时,我们如何更新数据?

惯性思维:

a. 可以将视图控制器暴露给 view-model, 以便于当相关数据变化或类似事件发送时它可以调用一个 “updateUI” 方法. (别这么干. )

b. 在 view-model 上将视图控制器作为一个委托?当 view-model 内容有变化时发个通知?(不不不不. )

解决问题的思路:

视图控制器会感知一些变化的发生. 我们可以使用从 UITextfield 得来的委托方法在每当有字符变化时通过检查 view-model 来更新按钮的状态.

这种方法解决的场景是在只有再文本框发生变化时才会影响 view-model 中的isUsernameValid值. 假使还有其他变量/动作改变isUsernameValid的状态将会怎么样?对于 view-model 中的网络调用会怎么样?或许我们该为 view-model 上的方法加一个完成后回调处理, 这样我们此时就可以更新 UI 的一切东西了?使用珍贵而笨重的 KVO 方法怎么样?


进入ReactiveSwift中

上一篇 下一篇

猜你喜欢

热点阅读