文档章节

怎样降低iOS代码耦合性

hejunbinlan
 hejunbinlan
发布于 2015/06/01 10:48
字数 1270
阅读 20
收藏 0

综述

凡是维护过中型项目的iOS工程师都应该有过类似的体验:ViewController代码繁重、功能复杂、维护困难,整个工程寥寥几个ViewController就完成了整个项目的开发。每个控制器中都囊括了所有的页面布局、委托代理、网络请求、数据库操作和核心功能,这样的代码往往问题重重,修改起来牵一发而动全身,着实令人头疼。

为了应对这一系列的问题,苹果公司的工程师给我们提供了很多选择去更好的在项目工程中贯彻MVC的设计理念,例如使用从前的Interface Builder制作xib可视布局,现在已经内置到xcode里面,并且提供了更为强大Storyboard功能,来减少控制器中的页面样式布局代码量;再例如NSFetchedResultsController这样的类和CoreDataheUITableViewController的完美结合,大大减少类似构架项目的代码量,并且稳定高效。

这些技巧在objc.io上有一个专门的专题,推荐给大家对应中文站objc中国,感谢objc 中国项目组。

Storyboard与代码耦合性

如果放在两年前去讨论iOS工程要不要使用Stortboard进行布局,我们可能还会犹豫一下,很多iOS程序猿内心会有一种想把一切化为代码掌控在手中的想法,选择拒绝使用Storyboard或者更早的xib。但事到如今,iPhone、iPad的屏幕尺寸越来越多,工程里为了适配不同屏幕冗余代码越来越长的时候,Storyboard似乎成为了我们必须同时也是苹果公司在引导我们将要实践的方向。

iOS 6中的AutolayoutiOS 8中的Size Class,新技术的涌现正是为了应对更复杂的布局任务。有人可能会反驳说,自动布局也可以用纯代码完成呀。你说的没错,纯代码是可以完成,但其复杂程度远远不是重写Frame这么简单了,更灵活地将Storyboard和代码结合,才是比较完备的解决方案。

这里通过三个方面介绍通过使用Storyboard减小工程代码耦合性的途径:

  • IBDesignableIBInspectable

  • 预览Storyboard Preview

  • NSObjectRuntime Attributes

IBDesignable和IBInspectable

IBDesignableIBInspectable的出现为Storyboard提供了可视化使用高度自定义控件的方法,例子中我们在制作一个双行标签控件,用来显示日期和星期,命名为DateLabel,使用方法如下:

//IB_DESIGNABLE 标记IB_DESIGNABLE @interface DateLabel : UIView//IBInspectable 标记@property (nonatomic, strong) IBInspectable NSString* dateLabelText;@property (nonatomic, strong) IBInspectable NSString* weekLabelText;@end

其中,IB_DESIGNABLE标记赋予我们的继承类DateLabel可以在界面编辑器里面实时渲染的特权。IBInspectable则赋予让界面编辑器可以设置或者预置View的参数dateLabelTextweekLabelText。具体不多介绍了,有点跑题,大家可以参见如何在iOS 8中使用Swift和Xcode 6制作精美的UI组件,同样适用于Objective-CSwift

引用上文介IBInspectable支持Int,CGFloat,Double,String,Bool,CGPoint,CGSize,
CGRect,UIColor,UIImage等类型的变量。

现在在Github上已经有一部分开源的UI控件使用了这项特性,如此一来,很多需要在代码中实现的控件自定义特性,都可以在Storyboard中完成,后者的优势也很明显:

  1. 所见即所得

  2. 剥离了ViewController中的定制View代码,减小耦合

预览Storyboard Preview

Storybord中提供了预览功能,可以预览其界面在各个尺寸设备上的真实显示效果。详见Xcode 6中学习Swift、CloudKit 和 Testflight,搜索Storyboard Preview

NSObject和Runtime Attributes

大家对这个概念再熟悉不过了,但大家有没有对他作为一个没有界面的控件在Storyboard作用产生过疑问呢。先来看下这篇文章 0代码ViewController的前言。

Storyboard中的NSObject可以是UITableViewDataSource,也可以是MapViewDelegate,连线一下,就能将原本在ViewController中写得最多的代理方法全部移出,并且,当你需要的时候,这些现成的代理方法,可以直接移到其他的项目中使用。

Runtime Attributes功能则可以在Storyboard中给参数写好初始值,但这里如果控件没有对应的参数的话,则会出现下面的报错。

Failed to set (xxx) user defined inspected property on (xxx): [ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key xxx.

Storyboard小结

当你了解了Storyboard的基本原理,就会发现Storyboard是一个很好用的工具,是Model-View-Controller模型中Controller跳转逻辑和View初始化的实用载体,从根本上把Controller中的导航代码移出,把页面配置代码、触摸事件甚至协议委托方法分摊到其他实例中,各个类各司其职,整个项目的逻辑也变的更加清晰、更易维护。


本文转载自:http://segmentfault.com/a/1190000002498637

hejunbinlan
粉丝 42
博文 596
码字总数 21569
作品 0
浦东
高级程序员
私信 提问
iOS项目框架架构模式(MVC、MVVM、MVCS、VIPER的选择)

联系人:石虎 QQ:1224614774昵称: 嗡嘛呢叭咪哄 QQ群:807236138群称: iOS 技术交流学习群 一、概念 没有最好的架构,只有适合自己的业务的架构才是最好的架构,并且它是逐步地变强变大。 架构...

石虎132
2018/09/12
0
0
苹果将为 iOS 8.3 和 iOS 9 推出公测版,为减少 Bug

为了在正式版发布前减少 iOS 系统的 Bug 数量,苹果计划为 iOS 操作系统推出公测项目。根据熟悉该计划的消息人士爆料,去年苹果为 OS X Yosemite 推出了相似的公测计划,苹果计划通过目前的 ...

oschina
2015/02/21
1K
0
苹果 iOS 10 更新消息汇总,iPhone 4s 可能用不了

自从iOS 7放弃沿用数代的拟物化界面,开启全新的扁平化系统以来,iOS每一年都在前作的基础上进行完善,使iOS更加的好用、完美。去年6月,苹果发布了新一代操作系统iOS 9,并在9月份发布新款i...

oschina
2016/05/30
5.1K
29
iOS 7 应用开发者需要注意的五件事

据国外媒体报道,苹果在 今年早些时候的“全球开发者大会”(WWDC)已经明确表示将在今年秋天发布旗下全新移动操作系统iOS 7,这一版本的iOS将完全摒弃过去的“拟物”设计风格,并开始采用实...

oschina
2013/08/13
2.2K
3
Swift语言从天而降,能否掀起新一轮的科技革命?

Swift语言从天而降,能否掀起新一轮的科技革命? Swift语言诞生到现在,才短短一个月多,Swift竟然挤进TIOBE排行榜的第16位,相信这发展的速度绝不是任何一个语言可与之相提并论,那Swift到底...

sdefzhpk
2014/07/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

PHP Xdebug调试专题

1、介绍与安装 Xdebug是一个PHP扩展,安装配置好后,可以自动记录运行了哪些函数,用了多少毫秒,从哪个文件运行到哪个文件等等 它记下来的调试信息很详细,对一些复杂程序跟踪调试有很大的辅助效...

sskill
32分钟前
0
0
死磕 java同步系列之Semaphore源码解析

问题 (1)Semaphore是什么? (2)Semaphore具有哪些特性? (3)Semaphore通常使用在什么场景中? (4)Semaphore的许可次数是否可以动态增减? (5)Semaphore如何实现限流? 简介 Semaph...

彤哥读源码
34分钟前
1
0
支付类系统数据处理和数据中台的数据处理方式有什么不同?

数据备份之后实时性如何保证 在建立数据中台的时候,数据还是来源于各个异构的业务应用系统,实现了数据的统一,但是数据实际上是多存了一份,数据存在冗余,同时数据实时性如何来保证了?针...

春哥大魔王的博客
35分钟前
3
0
那些你可能不知道的视频下载奇技淫巧

之前已经写过好几篇的奇技淫巧系列了,今天说说怎么快速下载视频。 我平常经常看视频的网站就是爱奇艺,b站,微博,知乎,网易这些。 这里以微博为例,下载周杰伦的《晴天》,微博地址是 ht...

苏生不惑
44分钟前
1
0
桶排序

private static double[] bucketSort(double[] array){ //1.得到数列的最大值和最小值,并算出差值d double max=array[0]; double min=array[0];// 找出......

暗中观察
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部