在Objective C中需要帮助更好地理解MVC

时间:2015-01-28 08:58:34

标签: ios objective-c iphone uitableview model-view-controller

我实际上是目标C中的新功能。我现在只在Objective C中做了一些项目。我尽可能地尽力在我的项目中实施MVC,尽管它可能很破旧。

所以基本上我到目前为止所学到的是(简单来说):模型:数据&逻辑。查看:图形输出。控制器:输入和更新模型/视图。 CMIIW。因此,控制器基本上是中间人,它只是为模型内部的逻辑提供输入,然后接收模型的输出以在视图中转换成图形表示,对吗?这些信息将通过代表的使用相互转移,对吗?

所以,如果有这个案例研究:

我有一个控制器,它有一个视图(将从故事板自动创建)和其中的许多子视图。让我们将这些子视图(及其模型)称为A,B和C.

所以我将有这些课程:

A_ModelB_ModelA_ViewB_ViewViewController

这些代表:

A_ModelDelegatesB_ModelDelegatesA_ViewDelegatesB_ViewDelegates,所有内容都应放入ViewController课程。

而且,如果UITextView中有UIButtonA_ViewUITableView中有UIImageViewB_View

应用程序的流程如下: 来自A_View对象的textView将获得输入,并且在那里有一个IBAction方法,用于调用A_ModelDelegates中的一个委托将输入数据发送回ViewController宾语。然后将数据发送到A_Model对象并进行处理。然后,模型将其发送回控制器以发送以更新A_View对象,并将B_Model对象作为bView中tableView和imageView参数的输入。现在使用AFNetworking库从网络序列化tableView。因此B_Model将数据作为NSDictionary对象获取,并通过其委托将其发送回控制器。控制器将使用它来填充和更新B_View对象中的tableView。

现在我的问题是:

  1. 这种对MVC的思考方式是否正确?

  2. 控制器的主要工作仅作为模型,视图和(可能是非常大的集合)各自代表的实例的容器。它只传递它们之间的数据?

  3. 如果我们使用AFNetworking从B_Model对象中的网络获取数据,那么应该会有成功和失败 其中有块,对吧?在故障块中,如果我们想要引发一个警告对话框,AFAIK我们有两种不同的方法,使用iOS 7中的UIAlertView和iOS 8中的UIAlertController。我们应该把它?该模型?控制器?还是视图?
  4. 我的印象是它应该放在控制器中,因为UIAlertController有这一行:[self presentViewController:alert animated:YES completion:nil];这是正确的吗?因此,我必须将UIAlertViewDelegate放在容器中,并在需要时从模型内部执行它们(例如,在模型未能通过网络获取数据的故障框中)通过模型的委托?如果有很多警报视图怎么办?
  5. 对于tableView的序列化,我应该在哪里放置数据源和委托?控制器还是视图?模型不应该知道视图,所以数据源和代表不应该放在那里,对吗?如果我们想把它放在控制器中,如果有很多表视图放入不同的子视图怎么办?如果有很多表视图,那么数据源和委托方法会非常大,因为每个表视图的所有输入/输出都必须放在那里。
  6. 仍然按照上面的问题。我的序列化方式是否正确?该模型从网络获取数据并将它们变成一个字典,该字典将通过其委托传递给控制器​​。然后字典将用于填充表格视图。
  7. 提前致谢。

1 个答案:

答案 0 :(得分:3)

我不确定,如果我从各方面理解你的Q是正确的。也许A会在评论后改变。

  

这种对MVC的思考方式是否正确?

基本上,但请看其余的答案。

  

控制器的主要工作仅作为模型,视图实例的容器,以及各自代表的(可能非常大的集合)。它只传递它们之间的数据?

不,它不仅仅是数据流的粘合剂。它还是控制流程的粘合剂。我认为你有一个误解:

即使在模型中使用逻辑也很性感,这是一种危险的想法。这样做可以使您的模型更具体地应用于应用程序。仅将模型视为数据集合,仅将“代码”用于其自身的一致性。即使是MVC也是一种常见的模式,这并不意味着你必须始终适应它。

  

如果我们使用AFNetworking从B_Model对象中的网络获取数据,那么应该有成功和失败块,对吧?在故障块中,如果我们想要提出一个警告对话框,AFAIK我们有两种不同的方法,使用iOS 7中的UIAlertView和iOS 8中的UIAlertController。我们应该把它放在哪里?该模型?控制器?或视图?

     

我的印象是它应该放在控制器里面因为UIAlertControllerthere的这一行:[self presentViewController:alert animated:YES completion:nil];它是否正确?因此,我还必须将UIAlertViewDelegate放在容器中并在需要时从模型内部执行它们(例如,在模型未能通过模型​​的网络获取数据的故障框中)通过模型的委托执行它们吗?如果有很多警报视图怎么办?

您应该将用于获取数据的代码放入控制器层,而不是放入模型层。这不仅仅是收集数据,因为可能存在更改控制流的错误。

  

对于tableView的序列化,我应该在哪里放置数据源和委托?   您没有序列化视图。您序列化使用表格视图显示的模型(或另一个视图,如果您选择了一个项目,或者......您通常有一个模型和多个视图来显示它的一部分。)

序列化从控制器层开始。它负责处理数据,错误......

  

控制器还是视图?模型不应该知道视图,所以数据源和委托不应该放在那里,对吗?如果我们想把它放在控制器中,如果有很多表视图放入不同的子视图怎么办?如果有很多表视图,那么数据源和委托方法会非常大,因为每个表视图的所有输入/输出都必须放在那里。

您可以使用额外的控制器进行序列化。控制器可以是委托或动作目标,但不必是一个。控制器很简单,是控制控制流的(可能是自定义的)类的实例。

由于模型是序列化的,而不是视图,因此它没有任何相关性,哪个视图显示哪些信息。

  

仍然按照上面的问题。我的序列化方式是否正确?该模型从网络获取数据并将它们变成一个字典,该字典将通过其委托传递给控制器​​。然后字典将用于填充表格视图。

控制器从网络获取数据,将其存储在模型中并更新视图,如果他们不能自动执行此操作。