Cocoa是Mac OS和iPhone OS上的开发框架,使用Objective-C做为开发语言。当然,在代码中也可以嵌入C和C++的语句。初识Objective-C时会觉得它的语法很奇怪,但本质上和其他面向对象语言都差不多。具体语法大家可以参考相关文档。

在Cocoa框架中:

所有的控件、窗口等都继承自 UIView,对应MVC中的 V。UIView及其子类主要负责UI的实现,而UIView所产生的事件都可以采用委托的方式,交给UIViewController实现。对于不同的 UIView,都有相应的UIViewController 对应MVC中的C。比如在iPhone OS上常用的UITableView,它所对应的Controller就是UITableViewController。至于MVC中的M,那需要根据用 户自己的需求来实现了。

下面看一下一个自定义UIView的架构是怎么样的。这之前要认识一下Objective-C中的几个重要的关键字。

@interface 定义一个类,这个很容易和Java中的interface混淆。

@protocol 定义一个协议,我跟喜欢把它理解成一个接口,相当于Java中的interface。

Objective-C只支持单继承,但可以实现多个协议(接口),语法如下:

Objective-c代码  
  1. @interface Child : Parent <Protocol1,Protocol2>
  2. {
  3. //成员变量定义
  4. }
  5. //成员方法,类方法,属性定义
  6. @end

有了以上的知识后,我们就可以来定义自己的UIView了。

首先是定义一个UIView的子类。

Objective-c代码  
  1. @interface MyUIView : UIView
  2. {
  3. //定义一些控件
  4. id<MyUIViewDelegate> delegate; //这个定义会在后面的解释,它是一个协议,用来实现委托。
  5. }
  6. //定义一些控件设置方法
  7. @property id<MyUIViewDelegate> delegate; //定义一个属性,可以用来进行get set操作
  8. @end

然后定义一个Protocol,按照Cocoa的习惯,一般它以delegate结尾,熟悉C#的同学应该知道它的意义。其实不论是接口,委托,还是回调函数,本质上都做了一件事情。就是定义了一个操作契约,然后由用户自己来实现它的具体内容。

Objective-c代码  
  1. @protocol MyUIViewDelegate
  2. //这里只需要声明方法
  3. - (void)func1
  4. - (int)func2:(int)arg
  5. @end

完成以上两步之后就需要设计自己的UIViewController了。一般简单的做法,可以让这个Controller来实现上面定义的MyUIViewDelegate。在Cocoa框架中,很多控件和它的Controller都是采用的这种方式。

Java代码  
  1. @interface MyUIViewController : UIViewController <MyUIViewDelegate>
  2. {
  3. //成员变量
  4. }
  5. //成员方法,类方法,属性
  6. @end

定义都完成了,到这里其实还看不出这三者是怎么联系起来的。那接下来就要看看,MyUIView和MyUIViewController的具体实现了。

首先是MyUIView的实现代码,假设在MyUIView在发生某个事件后会调用doSometing方法。

Objective-c代码  
  1. - (void)doSomething
  2. {
  3. if( delegate != nil )  //这里的delegate就是UIView定义时候的一个委托对象
  4. {
  5. [delegate func1]; //[]表示对一个对象发消息,如果在Java中会写成delegate.func1()
  6. }
  7. }

上面的代码中 nil 相当于 Java中的 null,这里的意思就很明显了,如果delegate委托对象不为空,则调用相应的方法,但是这个委托对象的方法在哪里实现呢。可以看一下 MyUIViewController的定义,它实现了MyUIViewDelegate。所以这个方法当然是由它来实现。代码如下

Objective-c代码  
  1. - (id)init
  2. {
  3. MyUIView *myView = [[MyUIView alloc] init]; //对MyUIView进行初始化
  4. myView.delegate = self; //将MyUIViewController自己的实例作为委托对象
  5. self.view = myView;
  6. }
  7. - (void)func1
  8. {
  9. //具体实现,可以加入Model相关的代码
  10. }

这么一来整个,整个代码的线路就明白了。

1.MyUIViewController初始化

2.MyUIViewController初始化时初始化MyUIView,并且将自己作为委托对象赋值给MyUIView

3.MyUIView发生事件,调用(回调)委托对象的方法,其实就是调用MyUIViewController的方法。

以上只是对Cocoa的编程模型进行了简单的分析,和大家交流一下。花了1个月时间学习Objective-C和Cocoa框架,感觉并不难学,熟 悉面向对象的同学应该能比较快上手。当然,它的语法是比较奇怪,我到现在有时还会写错,但习惯成自然嘛。对Mac OS和iPhone OS平台感兴趣的同学可以去研究一下,挺有意思的。

相关文章:

http://qwjcool.iteye.com/blog/265251

http://www.cnblogs.com/shanyou/archive/2011/02/02/1948899.html

Cocoa的MVC架构分析 cocoa的mvc实现相关推荐

  1. Cocoa的MVC架构分析

    Cocoa是Mac OS和iPhone OS上的开发框架,使用Objective-C做为开发语言.当然,在代码中也可以嵌入C和C++的语句.初识Objective-C时会觉得它的语法很奇怪,但本质上和 ...

  2. Java学习-MVC架构模式

    目录 1 传统方式处理业务的缺点 2 MVC架构模式理论基础 4 MVC架构模式如何设计 4.1 设计JDBC工具类的封装 4.2 创建封装数据的对象 4.3 设计Dao模式 4.4 业务逻辑编写 4 ...

  3. MVC架构和SSM框架的个人理解

    MVC架构和SSM框架的个人理解 前言 一.原生JavaWeb对应MVC架构 二.SSM框架对应MVC架构 第一块内容(MyBatis): 第二块内容(Spring): 第三块内容(SpringMVC ...

  4. 基于REST的MVC架构设计与实现

    在上一篇随笔已经讲述了REST的WEB serivce架构的相关知识,并且搭建了一个非常简单的实例,在另一篇随笔中也写了ajax用JSON序列化数据的传输,在这篇文章将结合前两篇随笔所讲的知识做一个稍 ...

  5. 看透 Spring MVC 源代码分析与实践 —— 俯视 Spring MVC

    Spring MVC Spring MVC 之初体验 环境搭建 在 IDEA 中新建一个 web 项目,用 Maven 管理项目的话,在 pom.xml 中加入 Spring MVC 和 Servle ...

  6. MVC架构在Asp.net中的应用和实现

    MVC架构在Asp.net中的应用和实现 摘要:本文主要论述了MVC架构的原理.优缺点以及MVC所能为Web应用带来的好处.并以"成都市信息化资产管理系统"框架设计为例,详细介绍其 ...

  7. 八字算命网站源码技术细节解析:使用PHP和JAVA实现的MVC架构、MySQL数据库设计和功能模块介绍

    技术文档:八字算命网站源码 1. 简介 本文档介绍了八字算命网站源码的技术细节,包括使用的技术.架构.数据库设计.代码结构和功能模块等. 2. 技术选型 本网站采用PHP和JAVA两种技术开发,具体如 ...

  8. Nodejs 服务端MVC架构

    前言 之前分享了一篇 Nodejs 与 MySQL 数据库交互 的文章,这篇文章主要是讲 mysql模块的使用方式.今天准备分享一篇 Nodejs 服务端 MVC 架构,通过服务端提供的API来完成数 ...

  9. 从MVC框架看MVC架构的设计

    尽管MVC早已不是什么新鲜话题了,但是从近些年一些优秀MVC框架的设计上,我们还是会发现MVC在架构设计上的一些新亮点.本文将对传统MVC架构中的一些弊病进行解读,了解一些优秀MVC框架是如何化解这些 ...

最新文章

  1. AI检测制造“零缺陷”
  2. ACM/ICPC 之 DP解有规律的最短路问题(POJ3377)
  3. C++最简单的方式实现split分割函数
  4. CSS扩展“less和”sass“
  5. 总线协议之I2C总线时序
  6. JS之ES6扩展运算符三个点(...)用于剥离{} 获取属性值
  7. python 清屏_Python学前准备如果你知道要去哪,那么全世界都给你让路
  8. 执行yum:Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again...
  9. java中的criteria_java-jpa-criteriaBuilder使用入门
  10. Windows下安装和配置Java JDK
  11. MATLAB 学习笔记(5)MATLAB 数据的导入和导出
  12. NR/5G - 一种TDD+FDD场景下Type I codebook size分析
  13. 人工智能辅助服装设计 | Mixlab论文带读
  14. 什么是质量功能配置(QFD)(转载)
  15. 机器学习二(python sklearn逻辑回归)
  16. 读入输出优化 黑科技 快过freadfwite
  17. 左倾红黑树(LLRBT)删除操作及相关性质总结答疑
  18. 【东大自控笔记1】闭环控制系统及传递函数求解
  19. 将Windows系统移到另一个硬盘
  20. 2023年西安电子科技大学电子信息考研上岸经验分享

热门文章

  1. html 让表格在右侧显示不出来,css中怎么解决表格边框不显示的问题?
  2. MySQL服务的启动与停止-使用命令行工具
  3. 接口调试利器:Postman
  4. Redis中的数据迁移
  5. Stream流的常见生成方式
  6. maven工程servlet实例之jar包冲突解决
  7. 反射获取构造方法并运行的快速的方式
  8. 角色关联权限操作-代码实现
  9. RocketMQ的Producer详解之顺序消息(原理)
  10. 垃圾回收机制之标记清除算法