iOS开发技巧

时间:2024.5.15

iOS开发技巧

原文作者是开发界中知晓度相当高的 Mugunth Kumar,他是 MKNetworkKit 的作者(虽然没有 AFNetworking 使用那么广泛,但也是一个很棒的 Network Kit),更是最近流传甚广的《iOS 5/6 Programming - Pushing The Limits》的作者。

文章中 MK 介绍了几点开发中常用的小技巧,几条 Tips 简单易懂,但是很实用,不但可以提高开发效率,而且可以提高代码的可读性和可复用性。

Types in Objective-C 和 Naming Conventions 两个章节介绍性内容较多,下面从 Subclassing 开始简单直译一下,第一次翻译,有诸多不到位的地方,各位多包涵。

Subclassing 继承/子类

大多语言允许开发者子类化框架所提供的类,但是在 Objective-C 中不完全是这样。大部分常用的类,诸如 NSArray、NSSet、NSDictionary 基本上都是集合类型的。不建议继承这些类,除非你准备转发调用或者实现所有必要的原始方法。

在传统的开发语言中,通常会通过继承基础类型(类似 NSArray 的类)来新增方法,重载已有的方法,或是自定义 UI 组件的外观。在 Objective-C 中,一般通过 Category 来扩展新方法。通过混合方法(swizzling the method?)来重载 SDK 提供的实现。以及外观相关的代理协议(Protocol)来定制 UI 组件的外观。

虽说如此,还是有一些类是经常会继承它们的,比如 UIViewController、

UITableViewController、UIControl 等。继承 UIViewController 大概是开发过程中最棒的一件事,因为它使得添加常见的功能变得异常简单。在我开发的每个 App 中,会有一个继承自 UIViewController 的子类,它实现了一组常用的方法。所有其他的 View Controllers 则都继承自这个基础类。

(译者注:Web 开发中也常会有一个用于被继承的 BaseController 来提供公共方法,看来开发是触类旁通的,要多思考)

所以,以下继承方法:

1. @interface MyAppFeaturedYouTubeVideosViewController : UIViewController

应该替换成:

北大青鸟中关村软件学院

地址:北京市海淀区中关村大街49号大华科技商厦C座3层

1.

2. @interface MyAppFeaturedYouTubeVideosFeaturedViewController : MyAppViewController @interface MyAppViewController : UIViewController 这个公用基础类可以在后续开发过程中用来添加公用的方法。在这个基础父类中,我通常会申明以下方法:

1.

2.

3.

4.

5.

6.

-(UIView*) errorView; -(UIView*) loadingView; -(void) showLoadingAnimated:(BOOL) animated; -(void) hideLoadingViewAnimated:(BOOL) animated; -(void) showErrorViewAnimated:(BOOL) animated; -(void) hideErrorViewAnimated:(BOOL) animated;

实现如下:

1.

2.

3.

4. 5. 6.

7.

8.

9.

10.

11.

12. 13. 14. 15. 16.

17.

18.

19. 20. 21. 22.

23.

24.

25. 26.

27.

28.

29.

30. -(UIView*) errorView { return nil; } -(UIView*) loadingView { return nil; } -(void) showLoadingAnimated:(BOOL) animated { UIView *loadingView = [self loadingView]; loadingView.alpha = 0.0f; [self.view addSubview:loadingView]; [self.view bringSubviewToFront:loadingView]; double duration = animated ? 0.4f:0.0f; [UIView animateWithDuration:duration animations:^{ loadingView.alpha = 1.0f; }]; } -(void) hideLoadingViewAnimated:(BOOL) animated { UIView *loadingView = [self loadingView]; double duration = animated ? 0.4f:0.0f; [UIView animateWithDuration:duration animations:^{

loadingView.alpha = 0.0f;

北大青鸟中关村软件学院

地址:北京市海淀区中关村大街49号大华科技商厦C座3层

31.

32.

33.

34.

35.

36.

37.

38.

39.

40.

41.

42.

43.

44.

45.

46.

47.

48.

49.

50.

51.

52.

53.

54.

55.

56.

57.

58.

59. } completion:^(BOOL finished) { [loadingView removeFromSuperview]; }]; } -(void) showErrorViewAnimated:(BOOL) animated { UIView *errorView = [self errorView]; errorView.alpha = 0.0f; [self.view addSubview:errorView]; [self.view bringSubviewToFront:errorView]; double duration = animated ? 0.4f:0.0f; [UIView animateWithDuration:duration animations:^{ errorView.alpha = 1.0f; }]; } -(void) hideErrorViewAnimated:(BOOL) animated { UIView *errorView = [self errorView]; double duration = animated ? 0.4f:0.0f; [UIView animateWithDuration:duration animations:^{ errorView.alpha = 0.0f; } completion:^(BOOL finished) { [errorView removeFromSuperview]; }]; }

现在,App 中的每个 View Controller 中,可以很方便的通过调用以上方法来改变当前 View 的状态为 Loading 或者 Error。而且,View Controller 可以通过重载 -errorView 和 -loadingView 方法来提供自定义错误界面和 Loading 界面。

你还可以通过重载这个基础类中的 -viewDidLoad 来统一修改所有 View 的表现。比如为所有的 View 添加相同的背景图片或背景色:

1.

2.

3.

4. - (void)viewDidLoad { [super viewDidLoad];

self.view.backgroundColor = [UIColor appOffWhiteColor]; // changes all my views to "off-white"

北大青鸟中关村软件学院

地址:北京市海淀区中关村大街49号大华科技商厦C座3层

5.

} UI Customization 自定义 UI

自定义 UI 可以大致分成两类,一是自定义控件,二是皮肤/主题。前者可以让 App 更出色,而后者是大部分 App 都需要的。我建议给 UIFont 和 UIColor 写 Category 扩展来提供自定义字体和自定义颜色。

例如,给 UIFont 添加如下方法:

1.

2.

3.

4.

5. 6.

7.

8.

9. +(UIFont*) appFontOfSize:(CGFloat) pointSize { return [UIFont fontWithName:@"MyriadPro-Regular" size:pointSize]; } +(UIFont*) boldAppFontOfSize:(CGFloat) pointSize { return [UIFont fontWithName:@"MyriadPro-Black" size:pointSize];

}

你就可以很方便地使用 [UIFont appFontOfSize:13] 得到 MyriadPro-Regular 字体。这样当你的设计需求变更时,就可以很快速的更换整个 App 中的字体。

相同的设计模式也可以应用到自定义颜色中。给 UIColor 添加以下方法:

1.

2.

3.

4.

5. #define GREY(color) [UIColor colorWithRed:color/255.0 green:color/255.0 blue:color/255.0 alpha:1] +(UIColor*) appBackgroundColor { return [UIColor colorWithPatternImage:[UIImage imageNamed:@"BGPattern"]];

}

+(UIColor*) appBlack1Color {

return GREY(38);

}

+(UIColor*) appOffWhiteColor {

return GREY(234);

} 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.

北大青鸟中关村软件学院

地址:北京市海淀区中关村大街49号大华科技商厦C座3层

所以,千万不要用 Interface Builder 来选颜色。 Subclassing UILabels 继承 UILabel

还有一个小窍门,当开发者继承 UILabel、UITextField 和 UITextView 时,通常在 -initWithFrame: 和 -initWithCoder: 方法中设置字体和颜色,参见以下代码:

1. @implementation AppPrefixLabel

2.

3. -(void) setup {

4.

5. self.font = [UIFont fontWithName:@"SourceSansPro-Semibold" size:self

.font.pointSize]; self.textColor = [UIColor redColor];

}

-(id) initWithFrame:(CGRect)frame {

if((self = [super initWithFrame:frame])) {

[self setup];

}

return self;

}

-(id) initWithCoder:(NSCoder *)aDecoder {

if((self = [super initWithCoder:aDecoder])) {

[self setup];

}

return self;

}

@end 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.

这个技巧使得开发者可以在 Interface Builder 中自定义这些元素的外观。在 IB 中拖入一个 UILabel,并且修改它的类为你自定义的类,瞬间就完成了这个 Label 字体和颜色的自定义,不用任何多余的代码。

这个技巧多数情况下相当管用,但是当你的 App 支持自定义主题,且用户可以通过设置界面更换主题时,就会显得有些麻烦。

北大青鸟中关村软件学院

地址:北京市海淀区中关村大街49号大华科技商厦C座3层

-initWithFrame: 和 initWithCoder: 会在 UI 组件创建的时候被调用,所以在这之后如果要改变字体和颜色,就需要很多额外的代码。因此,如果你的 App 支持主题,写一个主题管理器的全局单例来提供全局的主题、字体、颜色。

如果你用到了我说的第一个方法,你的 UIFont 的 Category 现在可以这样实现了: 1. +(UIFont*) appFontOfSize:(CGFloat) pointSize {

2.

3.

4.

5.

NSString *currentFontName = [[ThemeProvider sharedInstance] currentFontName]; return [UIFont fontWithName:currentFontName size:pointSize]; } UIColor 同理。其实没有正确或错误的方法,上述方法都是可行的。

遵从这里提到的设计模式,可以让你的代码干净得像写的很漂亮的 JS/CSS。试着在你的下一个项目中用这些方法吧。

Allen 后记

之前在想 iOS 开发到底是否需要一个类似 Web 开发中的所谓的框架,但渐渐发现其实 iOS SDK 本就是一个高度封装了的框架了,可能我们需要的不是更更高层的框架,而是一种好的设计模式、开发习惯和代码结构。因此是不是可以从一个 Project 的层面出发,写一个干净的框架,并且定义一些规范,就是一个很好的“框架”了?而不是非得提供 Router 之类的往 Web 开发框架去靠。

北大青鸟中关村软件学院

地址:北京市海淀区中关村大街49号大华科技商厦C座3层


第二篇:学 iOS 开发的一些经验


学习iOS开发的一些经验

不知不觉作为 iOS 开发也有两年多的时间了,记得当初看到 OC 的语法时,愣是被吓了回去,隔了好久才重新耐下心去啃一啃。啃了一阵,觉得大概有了点概念,看到 Cocoa 那么多的 Class,又懵了,怎么才能调用系统的相机?怎么保存信息?怎么做一个像 Twitter 个人页那样的页面?总之就是不知道该从哪切入。

现在回想起来,其实路一直都在,而且有很多条,当初如果有人能够指出一条还不错的道,或许就能走得不那么艰难。于是就有了这篇文章,希望对后人能有所帮助吧。

基础

一定的编程经验

这里说的编程经验是至少熟练一门编程语言,对 OOP 有一定的了解,最好熟悉一些基本的设计模式。遇到过的好多 iOS 开发,大多是从别的语言转过来的,所以有一定的编程基础,学起来会更容易 get the point.

如果是第一次接触编程,当然也是没问题的,只是要做好心理准备,可能会比想象的难。 英语

发现不少开发对于英语似乎有点接受不能,通常都是中文优先,除非迫不得已,才硬着头皮看看 StackOverflow,英文文章,文档等。忘了是谁说过「难走的路越走越好走」,通常如此。其实只要稍微 push 一下自己,那些技术文章啃下来应该不会有太大的问题,有过几次成功的体验后,这种恐惧感就会减少很多。优质的文章、视频、书籍,多是英文的,不迈过这个 坎,将来要么成为瓶颈,要么花更大的成本去填补。

入门

书籍

要学习 iOS 开发,自然要先学 Objective-C (当然现在也可以直接上 Swift,不过如果多人协作的话,OC目前还是主流),因为 OC 是 C 语言的超集,所以了解 C 语言对于学习 OC 肯定会有帮助,不过就算不了解,直接学 OC 也没太大问题。

这里推荐 BNR (Big Nerd Ranch) 的这本 Objective-C Programming The Big Nerd Ranch Guide,讲解地比较细致,能帮助你更好的理解 OC,更重要的是教你遇到问题时,如何去解决问题,以及这个问题对应的一些知识点,如何使用文档等等。

来到一个新的世界,肯定会对这个世界充满好奇,想订阅一大堆博客,买一堆书,看各种教程和视频,然后就变得浮躁,不知该从哪下手,这会导致拖延症。 我渴了,给我倒一杯水,这个很直接,马上就可以做,但如果是给我买一瓶饮料,而自己对那些饮料又不怎么熟悉时,就纠结了,不如刷会微博,看看朋友圈,玩个小游戏先。

所以一本好的入门教材很重要,要契合自己当前的水平,且常常会有收获,这种成就感会激励着你继续学下去。

在看书的过程中,往往会有这样的经历:书中提到某个人、观点、知识点、书、文章,然后就顺着它提到的这些东西出去了,可能某个知识点又牵扯到另一些内容,然后就这样越走越远。想起了一个故事——

三只猎狗追一只土拔鼠,土拔鼠逃跑时钻进了一个树洞。这个树洞只有一个出口,不一会儿,忽然从树洞里跑出一只兔子。兔子飞快地向前跑,并爬上另一棵大树。兔子因为慌乱在树上没站稳,掉了下来,砸晕了正仰头看的三只猎狗,最后,兔子终于逃脱。

对于这个故事可以从不同的角度去解读,我更愿意以初心去解读。兔子为什么会爬树?为什么能砸晕三只猎狗?这不是重点,重点是,之前追赶的土拨鼠哪去了?看书时难免会有延伸阅读,这个深度我觉得不宜超过 2 层,不然很容易就回不来了。

还有就是如果有可能,最好每天都看点,这其实是很难的,因为总是会有优先级更高的事,或者之前的某些习惯在干扰。一旦断了几天,就不想再拿起来了。

还有,苹果官方的 Start Developing iOS Apps Today 也是很不错的入门材料。

视频

推荐斯坦福老头子(Paul Hegarty)的 Developing iOS 7 Apps for iPhone and iPad ,当初也是看的这个(那时还是更老的版本),Paul 是资深的 Mac/iOS 开发(前苹果员工?),很多知识点讲得很到位,学生们的提问也大都在点上,同时配有Demo,总之听下来会对 iOS 开发有比较全面的了解。

同时推荐一本小册子:objc-zen-book,花不长时间就能看完,里面是一些 Best Practices,对于编写优质代码会很有帮助。

笔记

这是一个持久的过程,任何阶段都适用。以前也没太在意这个,觉得概念性的东西,脑子过一遍,就大概知道了,然后就去啃其他的东西了,现在看来,如果有记笔记的话,会更有助于消化概念、知识点,也可以记录自己的思考过程。达芬奇就记录了10000多页的笔记。

记笔记可以加深对知识点的理解,而成为编程巨星的唯一秘诀就是:对所做的事情理解地越深,就会做得越好。同时如果遵循遗忘曲线去复习的话,效果更佳。对知识点了解地足够透彻后,Debug 时才更有可能知道问题出在哪,解决问题也更容易有思路。

笔记不仅可以记知识点,也可以记录调试过程,比如这篇笔记,有一种调试方法:小黄鸭调试法

许多程序员都有过向别人(甚至可能向完全不会编程的人)提问及解释编程问题,就在解释的过程中击中了问题的解决方案。一边阐述代码的意图一边观察它实际上的意图并做调试,这两者之间的任何不协调会变得很明显,并且更容易发现自己的错误。

生活中我们可能不会真的这么去做,这时抽离出另一个自己,记录下跟ta的对话,也是个发现问题的好方法。

练习

这也是一个持续的过程,知道了些概念或原理后,总是会想着去验证下是不是这样,无论结果是否如自己预期,实践的过程会降低对语言的陌生感,慢慢地培养一种驾驭这门语言的自信,如果出了错,正好可以重新梳理一下。

目标

如果静下心来看完了 BNR 的这本书,以及斯坦福的 iOS 开发视频,那么对 OC 应该比较了解了,一些常用的 UIKit 用起来也没什么问题了,比如 UIViewController / UIView /

UIScrollView / UIImageView / UITableView。也熟悉一些概念,如 KVO / MVC / Delegate / DataSource。

这个阶段下来,应该会有:哦,iOS 开发也就这样嘛,多翻翻文档,熟悉 Cocoa Touch 的一些 Class,差不多也能做出一个简单的 App 了。

说了这么多,也没和大家说该如何学好这门技术,下面我们就来谈谈给怎样学好这门技术,学习开发这类的东西必须要找到好的方法,自学和培训是大家普遍选择的方法,但自学的点就是周期长还有就是不知该从何下手,培训的话会有系统的讲解和扎实的基础练习,可是这样也有缺点,比较费时费力,下面我先大家推荐另外的一种学习方法,互联网在线教学,是一种新兴的教学理念,让学生自己安排学习时间,并且系统的授课,随时随地接受正规的教学,像扣丁学堂这样的在线教育机构就做的很不错,当然还是要根据自己的学习方法和经验去寻找适合自己的一套学习iOS的学习方法,每个人都有属于自己的学习方法,一千个人有一千个哈姆雷特。

更多相关推荐:
iOS开发 关于SEL的简单总结

网址edu51CTOcomiOS开发关于SEL的简单总结1interfacePersonNSObject23voidtest14voidtest25end67根据h文件中定义的Person类和方法执行完这行代码...

关于零基础学习iOS开发的学习方法总结

关于零基础学习iOS开发的学习方法总结本文章由蓝鸥科技肖浩老师整理提供蓝鸥iOS培训将陆续发布技术文章如有需要可以添加关注希望对您的学习有所帮助关于零基础学习iOS开发的学习方法总结最近很多零基础来参加蓝鸥培训...

iOS开发程序猿必备技巧

iOS开发程序猿必备技巧随着移动智能手机的火爆作为移动智能手机操作系统的ios也越来越发火爆本文主要是一个潜伏在码农界N久的iOS程序猿总结收刮的一些ios开发精华技巧需要的ios码农请收藏对于这些技巧不喜勿喷...

不可不知的:iOS开发的22个诡异技巧

网址edu51CTOcom不可不知的iOS开发的22个诡异技巧结合自身的实践开发经验总结出了22个iOS开发的小技巧以非常欢乐的语调轻松解决开发过程中所遇到的各种苦逼难题光读着便已忍俊不禁1TableView不...

分享一些学习ios开发的心得

苹果系统凭借其流畅的系统和良好的用户体验赢得了一致好评由于对ios系统有浓厚的兴趣所以最近一直对苹果ios系统有关注度今年以来一直在学习有关ios方面的知识最近利用空余时间分享一些我在扣丁学堂在线学习的一些有关...

学习ios开发的心得

苹果系统凭借其流畅的系统和良好的用户体验赢得了一致好评由于对ios系统有浓厚的兴趣所以最近一直对苹果ios系统有关注度今年以来一直在学习有关ios方面的知识最近利用空余时间分享一些我在扣丁学堂学习ios有关的方...

总结分享10大iOS开发者最喜爱的库

网址edu51CTOcom总结分享10大iOS开发者最喜爱的库该10大iOS开发者最喜爱的库由iOS辅导团队成员MarceloFabri组织投票选举而得参与者包括开发者团队iOS辅导团队以及行业嘉宾每个团队都要...

ios开发 Swift语言的学习

ios开发Swift语言的学习ios开发Swift语言的学习iOS8横空出世给众人眼前突然间一亮实在是精彩无尽支撑iOS8的Swift语言占据了主导目前很多iOS开发人员面临从OC语言技能转向到Swift语言S...

学习ios开发就业工资

学习ios开发就业工资学习ios开发就业工资移动互联时代的到来让智能手机在全球范围内迅速普及iOS作为最具代表性的移动互联操作系统以其独有的优势获得用户认同iOS开发人员短缺的现象让很多企业一筹莫展转型移动互联...

总结最近ios开发心得

悦成移动移动互联网黄埔军校网址itindexhtml或百度悦成很多时候我们不需要关心这个类我们很少继承这个类偶尔会调用这个类的api来实现一些功能但是不可否认这个类是iOS编程中很重要的一个概念所以我这里写这个...

iOS开发流程总结

iOS开发流程总结20xx09121537佚名开源社区字号TT被苹果公司正式接纳为开发者之后会收到一封Email告知苹果iTunesConnection网站的地址这个网站相当于iTunes商店的quot供货商专...

ONVIF开发经验总结

ONVIF开发经验总结ONVIF开发经验总结1一利用gsoap2814生成Onvif相关源代码21生成onvifh头文件的方法21wsdl2h相关命令参数22链接网络生成23下载到本地生成24备注说明32生成o...

ios开发技巧总结(6篇)