iOS MVVM处理初始视图状态

时间:2018-09-21 04:43:50

标签: ios mvvm viewstate rx-swift reactive-cocoa

我试图在目标C中使用不带Rx的MVVM,基本上类似于MVP。我有一些基本的疑问要清除

1。)如何根据配置在视图中加载初始视图状态。即UI组件的初始状态可以基于某些配置值更改的时间。对于前。最初可以基于全局配置启用/禁用/隐藏视图中的按钮。在视图中可以有很多UI组件的地方,应如何呈现此初始视图状态?

  • 视图模型应该传递此配置(或视图状态对象)以进行查看,视图决定如何呈现自身吗?或
  • View模型应该将每个UI元素的状态传递给视图吗?
  • 对于Rx,VM应该具有每个UI组件的一个视图状态属性还是一个状态属性?

2。)如何处理各个UI组件的状态?

  • VM是否应该要求视图通过enableButton1,hideTextView等方法来更新其视图状态,或者
  • 它应该只将“事件”或数据传递给视图,并让视图决定如何对这些事件做出反应。
  • 在Rx世界中,视图绑定应具有单个状态属性还是仅具有事件属性?

3。)我很困惑谁应该触发某些操作,例如说“验证”。例如,在登录屏幕中,谁应该触发电子邮件/密码值的验证?

  • 应查看要求VM进行验证,然后要求执行登录过程,或
  • 视图应仅将带有电子邮件/密码值的点击动作传递给VM,VM决定是否进行验证以及验证通过还是失败该怎么办?

1 个答案:

答案 0 :(得分:0)

哇,这个问题有很多...让我们看看我能挑出来的东西:

  

在视图中可以有很多UI组件的地方应如何呈现此初始视图状态?

当不使用反应性系统时,无论是在Objective-C还是Swift中,我的视图控制器都以configureWithViewModel:(Obj-C)或configure(viewModel:)(swift)函数结尾,该函数在{ {1}},并且每次视图模型更改时。调用configure方法时,初始状态会在viewDidLoad中呈现。

  

视图模型应该传递此配置(或视图状态对象)以进行查看,视图决定如何呈现自身吗?   View模型是否应该将每个UI元素的状态传递给视图?

视图决定如何呈现自身,viewModel决定应该是什么。 viewModel仅处理动态的视图部分。因此,例如,如果UILabel中唯一不同的是文本,则viewModel为文本提供String。如果UILabel也更改了textColor,则viewModel同时提供String和UIColor。

  

对于Rx,VM应该具有一个视图状态属性还是每个UI组件的状态属性?

我个人为每个动态视图都给viewModel一个单独的Observable,但是在非Rx上下文中,我觉得这太复杂了,并且只有一个viewDidLoad可以同时提供所有状态。 / p>

  

如何处理各个UI组件的状态?

     
      
  • VM是否应该要求视图通过enableButton1,hideTextView等方法来更新其视图状态,或者
  •   
  • 它应该只将“事件”或数据传递给视图,并让视图决定如何对这些事件做出反应。
  •   

通过数据。该视图虽然没有决定。例如,update具有一个UIButton属性。在这种情况下,数据显然是isEnabled。 viewModel提供Bool,而ViewController只是将该布尔值分配给View(或视图将其分配给它自己)。

  

在Rx世界中,视图绑定应具有单独的状态属性还是仅具有事件属性?

状态属性。像这样:

Bool
  

我很困惑谁应该触发某些操作,例如说“验证”。例如,在登录屏幕中,谁应该触发电子邮件/密码值的验证?

上面的措辞有点令人困惑。没有“触发操作”。视图的输入部分在输入某些内容时通知视图模型,并且视图模型会忽略该输入或更新其状态。如果更新其状态,则将更新发送到视图的输出部分。因此,以验证为例,您可以执行以下两项操作之一:

  • 当用户点击“发送”按钮时,视图模型将收到电子邮件和密码。它负责做什么,并根据这些字符串的值更改其状态。然后,它通知视图控制器其状态已更改。

  • 当用户在每个文本字段(甚至可能是每个字符)中输入数据时,视图模型将获得当前文本字段的值。它负责做什么,并根据这些字符串的值更改其状态。然后,它通知视图控制器其状态已更改。

  
      
  • 应查看要求VM进行验证,然后要求执行登录过程,或
  •   
  • 视图应仅将带有电子邮件/密码值的点击动作传递给VM,VM决定是否进行验证以及验证通过还是失败该怎么办?
  •   

后者。想法是将尽可能多的工作移出视图控制器,以使其更易于控制/测试。