转自:http://blog.devtang.com/blog/2012/02/05/mvc-in-ios-develop/

前言

iphone开发相关的教程中最有名的,当数斯坦福大学发布的”iphone开发公开课”了。此公开课在以前叫做《iphone开发教程》,今年由于平板电脑的流行,所以也加入了ipad开发相关的课程。在网易公开课上,有该教程的2010年录象,并且前面15集带中文字幕文件,非常适合初学者学习。

在这里顺便说一下,网易公开课上的28集其实并不需要全部看完。真正的课程只有前面12集。后面的课程都是请一些业界的名人讲他们成功的app以及学生的作品展示,可看可不看。所以大家不要被28集这么多吓到。

由于近一年来iOS5以及xcode4的发布,苹果对原有的开发环境xcode以及开发语言Objective-C都有改进,所以原有的教程中很多 内容不再适用了。例如新的xcode4将Interface Builder集成到xcode中,整个IDE布局和快捷键完全大变样,又比如苹果为Objective-c引用了ARC和Storyboard,这些都 使得app的编程方式大为不同。

值得高兴的是,斯坦福大学最近更新了该公开课的2011年秋季录象,免费下载地址是:http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=480479762,不过现在该公开课还没有翻译,只能看英文原版了。新的课程相比以前要短了许多,一共只有9课。我大概快速看了一遍,总结一些心得给大家。

iOS的MVC模式

MVC模式算是客户端类程序使用的设计模式的标配了。iOS对于Model, View和Controller之间的相互调用有它自己的规范和约定,在公开课的第一课中,就介绍了应该如何将MVC模式应用在iOS开发中。主要的内容就体现在如下这张图中(图片来自该公开课第一课的配套pdf的第37页):

我下面详细介绍一下这幅图的意思。

  • 首先图中绿色的箭头表示直接引用。直接引用直观来说,就是说需要包含引用类的申明头文件和类的实例变量。可以看到,只有Controller中,有对Model和View的直接引用。其中对View的直接引用体现为IBOutlet。

  • 然后我们看View是怎么向Controller通讯的。对于这个,iOS中有3种常见的模式:

    1. 设置View对应的Action Target。如设置UIButton的Touch up inside的Action Target。
    2. 设置View的delegate,如UIAlertViewDelegate, UIActionSheetDelegate等。
    3. 设置View的data source, 如UITableViewDataSource。 通过这3种模式,View达到了既能向Controller通讯,又不需要知道具体的Controller是谁是目的,这样就和Controller解耦了。
  • 最后我们看Model。Model在图上有一个信号塔类似的图形,旁边写着Notification & KVO。这表明Model主要是通过Notification和KVO来和Controller通讯的。关于Notification,我写了一个模版代 码片段如下:(关于代码片段的管理,推荐大家看我写的另一篇文章:使用Github来管理xcode4中的代码片段

1
2
3
4
5
6
7
// 监听通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(<#methodName#>) name:kLoginNotification object:nil];
// 取消监听
[[NSNotificationCenter defaultCenter] removeObserver:self];
// 发送通知
NSDictionary * userInfo = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:200] forKey:@"code"];
[[NSNotificationCenter defaultCenter] postNotificationName:<#notification_name#> object:self userInfo:userInfo];

所以,对于初学者,要正确地使用MVC模式还是挺难的,回想我们以前做公司某产品iphone版的时候,就有一些Model层直接依赖了 Controller层,比如Model层更新数据失败了,直接调用Controller层显示出一个失败的提示界面。这样层次划分不清,造成我们做 ipad版的时候很痛苦。最后我们做了代码重构,把Model的相应改变都用Notification来完成,使得在做ipad版开发时轻松了很多。

Convention About synthesize

“Convention over configuration”(约定高于配置)成就了Ruby On Rails,而iOS也有很多编程的约定。这些约定单独看没有什么好处,约定的最大好处就是,如果大家都遵守它,那么代码风格会趋于一致,你会很方便地读 懂或修改别人的代码。

我们可以从第一课PPT的第50页看到如下的代码:

从图中可以看到,该课程推荐大家在使用synthesize关键字时,为property设置一个下划线前缀。我也看过一些iphone的开源项目,比如facebook开源的 three20 ,它是遵守了这样的约定的。

其它的约定还包括:

  • 以new, copy, alloc开头的方法,都应当由调用者来release,而其它方法,都返回一个autorelease对象。
  • 通常iphone顶部的bar应该用UINavigation控件,而底部的bar应该用UIToolbar控件。
  • 所有的UI操作都应该在主线程(UI线程)进行。这个似乎不是约定,但是好多同学不知道,也写在这儿吧。

UIView

刚开始对界面之间的跳转很不理解,后来发现其实很简单,就是一层一层叠起来的View。从View A上点击一个按钮跳转到View B,其实就是把View B“盖”在View A上面而已。 而“盖”的方式有好多种,通常的方法有2种:

一. 用UINavigationController把View B push进来。

1
[self.navigationController pushViewController:nextView animated:YES];

二. 用presentModalViewController方法把View B盖在上面。

1
[self presentModalViewController:nextView animated:YES];

除此之外,其实还有一种山寨方法,即把View A和View B都用addSubView加到AppDelegate类的self.window上。然后就可以调用 bringSubviewToFront 把 View B显示出来了,如下所示:

1
2
3
4
5
// AppDelegate.m类
[self.window addSubview:viewB];
[self.window addSubview:viewA];
// 在需要时调用
[self.window bringSubviewToFront:viewB];

上面说的是界面之间的跳转。对于一个界面内,其控件的布局其实也是一个一个叠起来的,之所以说叠,是指如果2个控件如果有重叠部分,那么处于上面的那个控件会盖住下面的。

Nib File

Nib文件实际上内部格式是XML,而它本身并不编译成任何二进制代码。所以你如果用iFile之类的软件在iPhone上查看一些安装好的软件的 目录,可以看到很多的以nib结尾的文件,这些就是该软件的界面文件。虽然这些XML经过了一些压缩转换,但是我们还是可以看到一些信息,例如它使用了哪 些系统控件等。

Nib文件刚开始给我的感觉很神秘,后来发现它其实就是用于可视化的编辑View类用的。其中的 File’s Owner一栏,用于表示这个View对应的Controller类。通常情况下,Controller类会有一个名为view的变量,指向这个view 的实例,我们也可以建立多个IBOutlet变量,指向这个view上的控件,以便做一些界面上的控制。

在Interface Builder上还有一个好处,是可以方便的将View的事件与Controller的IBAction绑定。只需要按住Ctrl键,从控件往 File’s Owner一栏拖拽,即可看到可以绑定的方法列表。其实这些只是简化了我们的工作,如果完全抛开Interface Builder,我们一样可以完成这些工作。我所知道业界的一些iOS开发部门,为了多人协作更加方便,更是强制不允许使用Interface Builder,一切界面工作都在代码中完成。如果你用文本编辑器打开Nib文件看过,就能理解这样做是有道理的。因为如果2个同时编辑一个界面文件,那 么冲突的可能性是100%,而且,从svn结出的冲突信息上看,你根本无法修正它。下面的代码演示了如何不用Interface Builder来添加控件以及绑定UI事件。

1
2
3
4
5
6
7
8
9
10
11
// SampleViewController.m的viewDidLoad方法片段
// 添加Table View控件
UITableView * tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 400)];
[self.view addSubview:tableView];
tableView.delegate = self;
[tableView release];
// 添加Button控件
self.button = [[[UIButton alloc] initWithFrame:CGRectMake(0, 0, 200, 100)] autorelease];
[self.view addSubview:self.button];
// 绑定事件
[self.button addTarget:self action:@selector(buttonPressed) forControlEvents:(UIControlEventTouchUpInside)];

总结

总体来讲,学习iOS开发还是比较容易的。我大概花了一个月时间学习iPhone开发,就可以边做边学了。

苹果的设计对于开发者来说是非常友好的,很多时候使用相应的控件就行了,都不用操心底层细节。不象Android开发,一会儿要考虑不同手机分辨率 不一样了,一会儿又要考虑有些不是触摸屏了,一会儿又发现某款手机的cpu内存太弱了跑不起来,需要优化程序。另外,Objective-C相对于C++ 语言来说,要简单优雅得多,而且更加强大,所以做iOS的开发者很省心。

要说到不爽的地方,就是iOS开发相关的中文资料实在是太少了。要学习它,基本上需要查看苹果的官方英文文档以及WWDC大会视频,还有去stackoverflow上问问题。这对于英文不太好的同学这可能是一个障碍。不过反过来,习惯之后,通过这个锻炼了自己的英文水平,倒也是一大收获。

ios专题 - 斯坦福大学iOS开发公开课总结的更多相关文章

  1. 斯坦福大学 iOS 开发公开课总结

     斯坦福大学 iOS 开发公开课总结   前言 iPhone 开发相关的教程中最有名的,当数斯坦福大学发布的 "iPhone 开发公开课 " 了.此公开课在以前叫做<iPho ...

  2. 2011斯坦福大学iOS应用开发教程学习笔记(第一课)MVC.and.Introduction.to.Objective-C

    blog.csdn.net/totogo2010/article/details/8205810  目录(?)[-] 第一课名称 MVC and Introduction to Objective-C ...

  3. 斯坦福大学IOS开发课程笔记(第七课第一部分)

    转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/31462099 作者:小马 这节课的内容太多,分两部分介绍.本节课主要是介绍怎样开发 ...

  4. IOS学习之斯坦福大学IOS开发课程笔记(第六课)

    转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/28398697 作者:小马 这节课主要讲述多个MVC是怎样协同工作的.到眼下为止.全 ...

  5. 斯坦福大学 iOS 7应用开发 ppt

    上网的找了很久都不全,最后发现原来网易那个视频下面就有完整的PPT..

  6. 斯坦福大学公开课:iOS 7应用开发 笔记

    2015-07-06 第一讲   课务.iOS概述 -------------------------------------------------- 开始学习斯坦福大学公开课:iOS 7应用开发留 ...

  7. 斯坦福公开课:Developing IOS 8 App with Swift(1-3)心得体会

    最近开始学习Swift开发移动程序.跟随斯坦福大学的公开课进行自学. 这真是一个美好的时代,虽然不能在斯坦福求学,但是可以观看录制的授课录像.讲义,好似老师在给我们上课一样! 心得: 1.每节课信息量 ...

  8. 斯坦福大学Andrew Ng教授主讲的《机器学习》公开课观后感[转]

    近日,在网易公开课视频网站上看完了<机器学习>课程视频,现做个学后感,也叫观后感吧. 学习时间 从2013年7月26日星期五开始,在网易公开课视频网站上,观看由斯坦福大学Andrew Ng ...

  9. 斯坦福大学公开课机器学习:advice for applying machine learning | diagnosing bias vs. variance(机器学习:诊断偏差和方差问题)

    当我们运行一个学习算法时,如果这个算法的表现不理想,那么有两种原因导致:要么偏差比较大.要么方差比较大.换句话说,要么是欠拟合.要么是过拟合.那么这两种情况,哪个和偏差有关.哪个和方差有关,或者是不是 ...

随机推荐

  1. suse系统FTP问题

    1.修改FTP端口问题 在 这个配置文件中vi /etc/vsftpd.conf 添加 Listen_port=34 vi /etc/services ftp        21/tcp    # F ...

  2. python yeild使用

    闲的蛋疼又想起之前看到的文章,想想还是拿来复习一遍写进博客里. 原文链接:https://www.ibm.com/developerworks/cn/opensource/os-cn-python-y ...

  3. WPP

    WPP(Wavefront Parallel Processing) 上一行的第二个LCU处理完毕,即对当前行的第一个LCU的熵编码(CABAC)概率状态参数进行初始化,如图5所示.因此,只需要上一行 ...

  4. HW4.25

    public class Solution { public static void main(String[] args) { double sum; for(int i = 10000; i &l ...

  5. 修复南尼U盘

    通常拿到手的U盘,用数码之家的ChipGenius一般检测不出主控型号,所以需要用到U盘量产工具来测. 量产工具注意版本 一般靠后的版本才能识别使用, . 如果识别不了==> 自动换成手动,U盘 ...

  6. PHP环境配置综合篇

    1.WNMP: http://www.wnmp.com.cn/     En: https://www.getwnmp.org/ 2.xampp:https://www.apachefriends.o ...

  7. MVC中一般为什么用IQueryable而不是用IList

    IList(IList<T>)会立即在内存里创建持久数据,这就没有实现“延期执行(deferred execution)”,如果被加载的实体有关联实体(associations),此关联实 ...

  8. 指纹增强程序Hong_enhancement

    本算法是基于Lin Hong et al 的论文“Fingerprint ImageEnhancement: Algorithm and Performance Evaluation”编写而成.其中一 ...

  9. [Machine Learning (Andrew NG courses)]II. Linear Regression with One Variable

  10. ADO.NET与Oracle(一):获取多行记录集

    近期接触ADO.NET和Oracle.将我寻常遇到的一些问题和大家共享. 我认为要想入门ADO.NET操作Oracle,最主要的要求就是要会通过ADO.NET更新Oracle中的数据. 该文简单讲些利 ...