我实际上是目标C中的新功能。我现在只在Objective C中做了一些项目。我尽可能地尽力在我的项目中实施MVC,尽管它可能很破旧。
所以基本上我到目前为止所学到的是(简单来说):模型:数据&逻辑。查看:图形输出。控制器:输入和更新模型/视图。 CMIIW。因此,控制器基本上是中间人,它只是为模型内部的逻辑提供输入,然后接收模型的输出以在视图中转换成图形表示,对吗?这些信息将通过代表的使用相互转移,对吗?
所以,如果有这个案例研究:
我有一个控制器,它有一个视图(将从故事板自动创建)和其中的许多子视图。让我们将这些子视图(及其模型)称为A,B和C.
所以我将有这些课程:
A_Model
,B_Model
,A_View
,B_View
和ViewController
这些代表:
A_ModelDelegates
,B_ModelDelegates
,A_ViewDelegates
,B_ViewDelegates
,所有内容都应放入ViewController
课程。
而且,如果UITextView
中有UIButton
和A_View
,UITableView
中有UIImageView
和B_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。
现在我的问题是:
这种对MVC的思考方式是否正确?
控制器的主要工作仅作为模型,视图和(可能是非常大的集合)各自代表的实例的容器。它只传递它们之间的数据?
B_Model
对象中的网络获取数据,那么应该会有成功和失败
其中有块,对吧?在故障块中,如果我们想要引发一个警告对话框,AFAIK我们有两种不同的方法,使用iOS 7中的UIAlertView
和iOS 8中的UIAlertController
。我们应该把它?该模型?控制器?还是视图?UIAlertController
有这一行:[self presentViewController:alert animated:YES completion:nil];
这是正确的吗?因此,我必须将UIAlertViewDelegate
放在容器中,并在需要时从模型内部执行它们(例如,在模型未能通过网络获取数据的故障框中)通过模型的委托?如果有很多警报视图怎么办? 提前致谢。
答案 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的序列化,我应该在哪里放置数据源和委托? 您没有序列化视图。您序列化使用表格视图显示的模型(或另一个视图,如果您选择了一个项目,或者......您通常有一个模型和多个视图来显示它的一部分。)
序列化从控制器层开始。它负责处理数据,错误......
控制器还是视图?模型不应该知道视图,所以数据源和委托不应该放在那里,对吗?如果我们想把它放在控制器中,如果有很多表视图放入不同的子视图怎么办?如果有很多表视图,那么数据源和委托方法会非常大,因为每个表视图的所有输入/输出都必须放在那里。
您可以使用额外的控制器进行序列化。控制器可以是委托或动作目标,但不必是一个。控制器很简单,是控制控制流的(可能是自定义的)类的实例。
由于模型是序列化的,而不是视图,因此它没有任何相关性,哪个视图显示哪些信息。
仍然按照上面的问题。我的序列化方式是否正确?该模型从网络获取数据并将它们变成一个字典,该字典将通过其委托传递给控制器。然后字典将用于填充表格视图。
控制器从网络获取数据,将其存储在模型中并更新视图,如果他们不能自动执行此操作。