几点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

应该替换成:

 
 
 
 
  
  
  1. @interface MyAppFeaturedYouTubeVideosFeaturedViewController : MyAppViewController

  2. @interface MyAppViewController : UIViewController

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

 
 
 
 
  
  
  1. -(UIView*) errorView;

  2. -(UIView*) loadingView;

  3. -(void) showLoadingAnimated:(BOOL) animated;

  4. -(void) hideLoadingViewAnimated:(BOOL) animated;

  5. -(void) showErrorViewAnimated:(BOOL) animated;

  6. -(void) hideErrorViewAnimated:(BOOL) animated;

 

实现如下:

 
 
 
 
  
  
  1. -(UIView*) errorView {

  2. return nil;

  3. }

  4. -(UIView*) loadingView {

  5. return nil;

  6. }

  7. -(void) showLoadingAnimated:(BOOL) animated {

  8.  UIView *loadingView = [self loadingView];

  9.  loadingView.alpha = 0.0f;

  10.  [self.view addSubview:loadingView];

  11.  [self.view bringSubviewToFront:loadingView];

  12. double duration = animated ? 0.4f:0.0f;

  13.  [UIView animateWithDuration:duration animations:^{

  14.    loadingView.alpha = 1.0f;

  15.  }];

  16. }

  17. -(void) hideLoadingViewAnimated:(BOOL) animated {

  18.  UIView *loadingView = [self loadingView];

  19. double duration = animated ? 0.4f:0.0f;

  20.  [UIView animateWithDuration:duration animations:^{

  21.    loadingView.alpha = 0.0f;

  22.  } completion:^(BOOL finished) {

  23.    [loadingView removeFromSuperview];

  24.  }];

  25. }

  26. -(void) showErrorViewAnimated:(BOOL) animated {

  27.  UIView *errorView = [self errorView];

  28.  errorView.alpha = 0.0f;

  29.  [self.view addSubview:errorView];

  30.  [self.view bringSubviewToFront:errorView];

  31. double duration = animated ? 0.4f:0.0f;

  32.  [UIView animateWithDuration:duration animations:^{

  33.    errorView.alpha = 1.0f;

  34.  }];

  35. }

  36. -(void) hideErrorViewAnimated:(BOOL) animated {

  37.  UIView *errorView = [self errorView];

  38. double duration = animated ? 0.4f:0.0f;

  39.  [UIView animateWithDuration:duration animations:^{

  40.    errorView.alpha = 0.0f;

  41.  } completion:^(BOOL finished) {

  42.    [errorView removeFromSuperview];

  43.  }];

  44. }

 

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

 

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

 

 
 
 
 
  
  
  1. - (void)viewDidLoad

  2. {

  3.  [super viewDidLoad];

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

  5. }

 

 

UI Customization 自定义 UI

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

 

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

 
 
 
 
  
  
  1. +(UIFont*) appFontOfSize:(CGFloat) pointSize {

  2. return [UIFont fontWithName:@"MyriadPro-Regular" size:pointSize];

  3. }

  4. +(UIFont*) boldAppFontOfSize:(CGFloat) pointSize {

  5. return [UIFont fontWithName:@"MyriadPro-Black" size:pointSize];

  6. }

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

 

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

 
 
 
 
  
  
  1. #define GREY(color) [UIColor colorWithRed:color/255.0 green:color/255.0 blue:color/255.0 alpha:1]

  2. +(UIColor*) appBackgroundColor {

  3. return [UIColor colorWithPatternImage:[UIImage imageNamed:@"BGPattern"]];

  4. }

  5. +(UIColor*) appBlack1Color {

  6. return GREY(38);

  7. }

  8. +(UIColor*) appOffWhiteColor {

  9. return GREY(234);

  10. }

 

所以,千万不要用 Interface Builder 来选颜色。

Subclassing UILabels 继承 UILabel

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

 
 
 
 
  
  
  1. @implementation AppPrefixLabel

  2. -(void) setup {

  3.  self.font = [UIFont fontWithName:@"SourceSansPro-Semibold" size:self.font.pointSize];

  4.  self.textColor = [UIColor redColor];

  5. }

  6. -(id) initWithFrame:(CGRect)frame {

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

  8.    [self setup];

  9.  }

  10. return self;

  11. }

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

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

  14.    [self setup];

  15.  }

  16. return self;

  17. }

  18. @end

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

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

 

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

 

如果你用到了我说的第一个方法,你的 UIFont 的 Category 现在可以这样实现了:

 
 
 
 
  
  
  1. +(UIFont*) appFontOfSize:(CGFloat) pointSize {

  2.  NSString *currentFontName = [[ThemeProvider sharedInstance] currentFontName];

  3. return [UIFont fontWithName:currentFontName size:pointSize];

  4. }

UIColor 同理。其实没有正确或错误的方法,上述方法都是可行的。

 

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

 

Allen 后记

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

目录 1. 开始 . 4 1.1.1.1. 基本设置 基本设置 . 4 建立你的 建立你的 SwiftSwift 环境 . 5 理解 SwiftSwift 导入过程 导入过程 . 6 2. 互用性 互用性 . 7 2.1. 2.1. 与 Objective ObjectiveObjective Objective Objective-C API 交互 7 初始化 (Initialization)(Initialization) (Initialization) (Initialization) (Initialization) (Initialization)(Initialization)(Initialization)(Initialization) (Initialization) 7 访问属性 访问属性 (Accessing Properties)(Accessing Properties) (Accessing Properties) (Accessing Properties) (Accessing Properties)(Accessing Properties) (Accessing Properties)(Accessing Properties)(Accessing Properties)(Accessing Properties) (Accessing Properties)(Accessing Properties) (Accessing Properties) . 8 方法 (Working with Methods)(Working with Methods)(Working with Methods)(Working with Methods)(Working with Methods) (Working with Methods) (Working with Methods) (Working with Methods) (Working with Methods) (Working with Methods) (Working with Methods) (Working with Methods) . 9 id 兼容性 兼容性 (id Compatibility)(id Compatibility) (id Compatibility)(id Compatibility) (id Compatibility)(id Compatibility) (id Compatibility)(id Compatibility) (id Compatibility) (id Compatibility) (id Compatibility) 10 使用 nil (Working with nilWorking with nilWorking with nilWorking with nil Working with nil Working with nil Working with nil Working with nil ) . 11 扩展( Extensions Extensions Extensions Extensions ) . 12 闭包( Closures ClosuresClosures Closures ) . 13 比较对象( 比较对象( Object Comparison Object Comparison Object Comparison Object Comparison Object ComparisonObject ComparisonObject ComparisonObject ComparisonObject Comparison) 14 SwiftSwift 类型兼容性( 类型兼容性( 类型兼容性( Swift Type CompatibilitySwift Type Compatibility Swift Type Compatibility Swift Type CompatibilitySwift Type Compatibility Swift Type Compatibility Swift Type CompatibilitySwift Type Compatibility Swift Type Compatibility Swift Type Compatibility Swift Type Compatibility) . 14 Objective Objective Objective Objective-C选择器 选择器 (Selectors)(Selectors)(Selectors) (Selectors)(Selectors)(Selectors)(Selectors) 15 2.2. 2.2. 使用 Objective Objective Objective Objective-C特性编写 特性编写 SwiftSwift 类 16 继承 Objective ObjectiveObjective Objective Objective-C的类 16 采用协议 采用协议 . 17 编写构造器 和析编写构造器 和析编写构造器 和析编写构造器 和析 . 17 集成 Interface Builder Interface BuilderInterface Builder Interface BuilderInterface Builder Interface Builder Interface Builder Interface Builder Interface Builder . 18 指明属性 特指明属性 特指明属性 特 . 19 实现 Core Data Managed Object Subclasses Core Data Managed Object SubclassesCore Data Managed Object SubclassesCore Data Managed Object Subclasses Core Data Managed Object SubclassesCore Data Managed Object Subclasses Core Data Managed Object Subclasses Core Data Managed Object Subclasses Core Data Managed Object Subclasses Core Data Managed Object Subclasses Core Data Managed Object SubclassesCore Data Managed Object Subclasses Core Data Managed Object Subclasses Core Data Managed Object Subclasses Core Data Managed Object Subclasses Core Data Managed Object SubclassesCore Data Managed Object Subclasses 20 2.3. Cocoa2.3. Cocoa 2.3. Cocoa 2.3. Cocoa2.3. Cocoa2.3. Cocoa数据类型 数据类型 . 20 字符串 . 21 数字 . 22 类集合 . 22 FoundationFoundationFoundation Foundation FoundationFoundation Foundation数据类型 . 24 FoundationFoundationFoundation Foundation FoundationFoundation Foundation函数 . 25 Core Foundation Core FoundationCore FoundationCore Foundation Core FoundationCore Foundation Core Foundation Core FoundationCore Foundation Core Foundation 25 2.4. 2.4. 采用 Cocoa CocoaCocoaCocoa设计模式 设计模式 . 27 委托 . 27 延迟初始化 延迟初始化 . 28 错误报告 错误报告 . 28 键值观察 键值观察 . 29 TargetTarget TargetTarget -Action Action Action模式 29 类型匹配与统一规范 类型匹配与统一规范 类型匹配与统一规范 类型匹配与统一规范 . 29 Using Swift with Cocoa and Objective-C 完整中文版(CocoaChina 精校) 3 2.5. 2.5. 与 C 语言交互编程 语言交互编程 语言交互编程 语言交互编程 30 基本数据类型 基本数据类型 基本数据类型 . 30 枚举 . 31 指针 . 32 全局常量 全局常量 . 37 预处理指令 预处理指令 . 37 3.Mix and Match3.Mix and Match 3.Mix and Match 3.Mix and Match 3.Mix and Match3.Mix and Match 3.Mix and Match3.Mix and Match . 39 3.1. 3.1. 在同一工程中使用 在同一工程中使用 在同一工程中使用 在同一工程中使用 SwiftSwift Swift 和 Objective Objective Objective Objective-C . 39 Mix and Match Mix and Match Mix and Match Mix and Match Mix and Match Mix and Match Mix and Match Mix and Match 概述 . 39 在同一个 在同一个 App Target App Target App TargetApp TargetApp TargetApp Target 中进行代码导入 中进行代码导入 中进行代码导入 中进行代码导入 . 40 在同个 在同个 Framework Framework Framework Framework Framework Framework Framework 的 TargetTarget TargetTarget 中导入代码 中导入代码 中导入代码 . 43 将 Swift Swift Swift 导入 Objc Objc . 44 导入外部 导入外部 FramewoFramewoFramewo FramewoFramewoFramework 44 在 Objective Objective Objective Objective-C中使用 中使用 SwiftSwift Swift 45 Product ModuleProduct ModuleProduct ModuleProduct Module Product Module Product Module Product Module Product Module 模块命名 模块命名 . 47 问题解决提示 问题解决提示 问题解决提示 . 47 4. 迁移 . 48 4.1. 4.1. 将 Objective ObjectiveObjective Objective Objective-C代码迁至 代码迁至 代码迁至 SwiftSwift . 48 为你的 为你的 Objective Objective Objective Objective-C代码迁移做好准备 代码迁移做好准备 代码迁移做好准备 代码迁移做好准备 48 迁移过程 迁移过程 . 48 问题解决提示 问题解决提示 问题解决提示 . 50 Using Swift with Cocoa and Objective-C 完整中文版(CocoaChina 精校) 4 1. 开始 1.1.1.1.1.1.1.1.基本 设置 本篇译者: 本篇译者: CreolophusCreolophusCreolophusCreolophus Creolophus Creolophus (githubgithubgithub githubgithub主页 ),敬请勘误。 ),敬请勘误。 ),敬请勘误。 ),敬请勘误。 ),敬请勘误。 重要事项 这篇文章初步介绍了在开发中用到的 API 或技术。苹果公司提供这些信息来帮助您规划本文所说明的技术和接口以用于苹果的产品上。这些信息会改变,并且根据这篇文章所实现的软件应该在最新的操作系统并根据最新的文档测试。本文档的新版本,可能在未来通过技术和 API 的 seeds 版本来提供 Swift 被设计用来无缝兼容 Cocoa 和 Objective-C 。在 Swift 中,你可以使用 Objective-C 的 API(包括系统框架和你自定义的代码),你也可以在 Objective-C中 使用 Swift 的 API。这种兼容性使 Swift 变成了一个简单、方便并且强大的工具集成到你的 Cocoa 应用开发工作流程中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值