转自: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. 基于.NET平台常用的框架和开源程序整理

    自从学习.NET以来,优雅的编程风格,极度简单的可扩展性,足够强大开发工具,极小的学习曲线,让我对这个平台产生了浓厚的兴趣,在工作和学习中 也积累了一些开源的组件,就目前想到的先整理于此,如果再想到, ...

  2. 洛谷1439 排列LCS问题

    洛谷1439 排列LCS问题 本题地址:http://www.luogu.org/problem/show?pid=1439 题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入输 ...

  3. Python的模块,模块的使用、安装,别名,作用域等概念

    所谓的模块就是将不同功能的函数分别放到不同的文件中,这样不仅有利于函数的维护,也方便了函数的调用.在Python中,一个.py文件就是一个模块(Module). 在模块的上层有一个叫做包(Packag ...

  4. openstack 调试

  5. Preferred Java way to ping a HTTP Url for availability

    I need a monitor class that regularly checks whether a given HTTP URL is available. I can take care ...

  6. [置顶] 第二届微软CRM交流年会

    第二届微软CRM交流会将在12月14日举行,亲们要是感兴趣可以查看下面的活动详情.Jeff也是第一次参加这类活动,作为本次活动的嘉宾我为大家带来一个挺有意思的分享主题<Dynamics CRM ...

  7. 经典SQL语句大全之基本函数

    SQL Server基本函数 1.字符串函数 长度与分析用 1,datalength(Char_expr) 返回字符串包含字符数,但不包含后面的空格2,substring(expression,sta ...

  8. IE无法打开internet网站已终止操作的解决的方法

    用IE内核浏览器的朋友,或许不经意间会碰到这样滴问题: 打开某个网页时,浏览器“嘣”跳出一个提示框“Internet Explorer无法打开Internet 站点...已终止操作”.而大多数情况下该 ...

  9. End-to-End Tracing of Ajax/Java Applications Using DTrace

    End-to-End Tracing of Ajax/Java Applications Using DTrace         By Amit Hurvitz, July 2007     Aja ...

  10. Installing the .NET Framework 4.5, 4.5.1

    This article provides links for installing the .NET Framework 4.5 and 4.5.1 on your computer.  If yo ...