ios开发中的争议

小敏的博客 小敏的博客     2022-07-28     118

关键词:

这是该系列的第二篇。在本文中,我想讨论的是:对于 UI 界面的编写工作,到底应该用 xib/storyboard 完成,还是用手写代码来完成?

 

本着 “使用过才有发言权” 原则,我介绍一下我的经历:

 

  • 最早在网易开发 “ 有道云笔记 “ 的时候,我们是使用 xib 来制作界面的。

  • 三前年创业编写 “ 粉笔网 “ 的时候,我也是使用 xib 来制作界面的。

  • 之后开发 “ 猿题库 “ 的时候,我尝试了一下使用 storyboard 来制作界面,但最后放弃了。之后我把大部分界面编写工作都改成由手写代码来完成。

  • 在去年开发 “ 小猿搜题 “ 的时候,由于时间紧,我又再一次使用了 storyboard,但是我现在计划将其用手写代码来重构一次。

 

xib 使用调研情况

 

除了我本人的经历外,我也调研了一下我手机中装的所有的 App 的开发情况,我写了一个脚本,分析了我手机中一共 100 多个 App 包含的 xib 文件的个数。通常情况下一个 App 如果完全通过 xib/storyboard 来完成的话,那么编写包含的 xib 个数不应该少于 10 个(注:storyboard 在打包时会被拆解成多个它包含的 xib 文件)。

 

这个调研的最终结果,以及我分析用的脚本源码在 这里。我挑了一些比较有名的应用列在下面。(我另外也列出了它们包含的 js 的文件数量,这个可以反应出该应用对基于 UIWebView 的 Hybrid 编程的使用情况,不过与本次讨论主题无关。)

 

软件名字nib 文件数js 文件数
Mailbox 2.3.3.ipa 0 0
Twitter 6.0.1.ipa 0 0
objcio 1.0.3.ipa 0 0
播客 2.0.ipa 0 0
知乎日报 2.5.ipa 1 2
百度视频 6.2.2.ipa 1 3
高德导航 9.2.ipa 1 0
优酷 4.3.ipa 2 3
网易云音乐 2.3.1.ipa 2 0
滴滴打车 3.6.2.ipa 3 0
网易新闻 416.ipa 4 1
QQ 5.4.ipa 9 2
猿题库 4.1.0.ipa 9 0
京东 .ipa 10 0
搜狐视频 4.6.3.ipa 10 0
快的打车 3.7.ipa 11 0
小猿搜题 1.4.0.ipa 12 0
WeChat 6.1.1.ipa 13 20
Evernote 7.6.5.ipa 23 25
有道云笔记 4.3.1.ipa 40 11
来往 4.3.2.ipa 48 0
百度地图 7.6.1.ipa 76 227
易到用车 6.2.2.ipa 106 0
网易有道词典 5.2.2.ipa 114 9
美图秀秀 3.5.0.ipa 155 3
支付宝钱包 8.5.3.ipa 158 7
手机淘宝 5.2.4.ipa 188 0
易信 1.4.8.ipa 292 12
大众点评 7.0.2.ipa 1783 5
iMovie 211.ipa 4323 1

 

以上这个表格说明了即使是比较著名的 App,在使用 xib/storyboard 上,也有很大的差异。举几个例子:

 

  • QQ、WeChat(微信)和易信同属于社交类应用,而且按理说,由于用户量和开发时间更长,QQ 和微信应该比易信更加复杂,但是从 xib 数量上,前者 xib 的数量都非常少。这说明,在 QQ 和微信中,很多界面肯定是通过手写代码来完成的。

  • 滴滴打车、快的打车和易到用车同属于叫车软件,按理说滴滴打车、快的打车同时包含叫出租车和叫专车功能,应该比易到用车功能更多,更复杂。但是前者 xib 的数量都非常少。这也说明,滴滴打车、快的打车的界面很多是通过手写代码来完成的。

     

     

  •  

另外,像 Mailbox、播客 (Podcast)、Twitter、objcio 这些 App 中 xib 的数量为 0,说明其完全是用手写代码来完成 UI 界面编写的。

 

当然,也有一些能看出来几乎是由 xib 构成的应用,例如大众点评、美图秀秀、网易有道词典。而苹果的 iMovie 使用了 4000 多个 xib,真让人不敢相信。我后来仔细看了一下,原来是因为 iMovie 做了国际化,每种语言大概有 120 个 xib,因为支持了将近 40 个语言,所以 xib 数量变成了 4000 多个。大众点评的每个 xib 也被切分成了 4 个,具体用处我还没研究,如下是一个示例:

 

./Payload/DPScope.app/WEDHotelShopInfoMainModule.nib
./Payload/DPScope.app/WEDHotelShopInfoMainModule.nib/objects-8.0+.nib
./Payload/DPScope.app/WEDHotelShopInfoMainModule.nib/objects.nib
./Payload/DPScope.app/WEDHotelShopInfoMainModule.nib/runtime.nib

 

讨论

 

就上面的调研我们就可以看出,其实大家对于是否应该使用 xib 做界面是有争议的。在实际案例中:

 

  • 既有像 Twitter,Mailbox,objcio 这样完全不使用 xib 做界面的情况。

  • 也有像 QQ、微信、滴滴打车、网易新闻、猿题库这样少量使用 xib 的情况。

  • 也有像支付宝、大众点评这样重度使用 xib 的情况。

 

那么我就从我的角度把用与不用 xib 的优缺点表达一下。

 

使用 xib 和 storyboard 的优点

 

  • 开发界面所见即所得,可以快速通过拖拽构造界面。

  • 你可以从 storyboard 中很方便地梳理出所有View Controller的界面间的调用关系。这一点对于新加入项目组的开发同事来说,比较友好。

  • 使用 Storyboard 可以使用Table View Controller的 Static Cell 功能。对于开发一些 Cell 不多,但每个 Cell 都不一样的列表类设置界面会比较方便。

  • 通过实现 – (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 方法,每个 View Controller 的跳转逻辑都聚集在一处,这方便我们统一管理界面跳转和传递数据。

  • Storyboard 可以方便将一些常用功能模块化和复用。例如 WWDC2011 年介绍 Storyboard 的视频就将微博分享功能模块化成一个单独的 Storyboard。

 

使用 xib 和 storyboard 的缺点

 

  • xib 对版本管理是灾难。storyboard 实际上的多个 xib 的集合,所以更容易让多人编辑产生冲突。而虽然它们是 xml 格式,但是冲突解决起来还是不如代码那么容易。

  • 苹果对 xib, storyboard 的设计中带有当前电脑的操作系统版本和 Xcode 版本。所以如果两个协作的开发者电脑操作系统或 Xcode 有不一样的话,每次打开必定会修改这个文件。另外即使操作系统版本和 Xcode 版本一样,有些时候打开看也会造成一些自动的修改。

  • storyboard 带来的 segue 的概念对于开发来说并不省事,特别是在需要传递参数的时候。如果是用程序内部 trigger 一个 segue,那么需要在另一个回调的地方设置 dest view controller 的参数信息。

  • 我们发现 xib 中设置的颜色值并不精确,RGB 在真机 / 模拟器上常常会有 10 多像素的偏差。

  • xib 和 storyboard 对继承的支持并不友好。无法做界面的继承。

  • xib 和 storyboard 对搜索支持并不友好,无法方便地在 Xcode 中查找关键词(但是可以通过写 bash 命令来查找)。

  • storyboard 对组合支持得不太好,不允许在一个 xib 中附带多个子 view。

  • xib 和 storyboard 不太方便做界面的模块化管理,比如我们想统一修改界面中所有按钮的字体样式,那么在 xib 和 storyboard 只能一个一个手工修改,而如果是代码编写的,则只需要改一个工厂方法的实现即可。

  • 对于复杂的 App,storyboard 的性能会比较差。

 

关于手写 UI 界面的一些挑战

 

所以我更喜欢用代码编写 UI 界面,加上现在移动开发对于 App 要求的需求越来越强烈,很多复杂的交互效果需要在代码中编写,这种情况下 xib 能提供的帮助越来越有限。

 

但是 xib 提供的 “所见即所得” 这种优势还是巨大的,如果我们是手写界面,那么调试起来是非常痛苦的。在这一里,我给大家推荐购买 Reveal 这个界面调试工具,Reveal 可以在 App 运行时动态地修改界面元素的参数,这样我们就可以一次性在代码中把界面元素的字体、颜色、位置这些参数在 Reveal 调试好,避免多次重启运行来调试界面。我在我的 《iOS 开发进阶》 书里,也花了一整章来介绍 Reveal 的使用。如下是书中的一个 Reveal 运行时截图:

 

技术分享

 

总结

 

其实,你完全不需要做一个 “艰难的决定”,你可以像 QQ 和微信那样,根据具体情况来选择性的使用 xib 和 storyboard。这里有我的一些建议:

 

  • 对于复杂的、动态生成的界面,建议使用手工编写界面。

  • 对于需要统一风格的按钮或UI控件,建议使用手工用代码来构造。方便之后的修改和复用。

  • 对于需要有继承或组合关系的 UIView 类或 UIViewController 类,建议用代码手工编写界面。

  • 对于那些简单的、静态的、非核心功能界面,可以考虑使用 xib 或 storyboard 来完成。

 

对于很多新手来说,他们接触到的都是使用 Interface Builder 来构造界面。希望本文让大家了解到 xib 和 storyboard 在开发中的争议,手写界面并不是一个小众的行为并且有很多好处,希望每一个人都能掌握它,并且在需要的时候根据具体情况来决定是否采用。

 

ios中的单例到底怎么写?

...模式自行百度。单例模式的好处自行百度。重点!iOS中的单例到底怎么写?无争议的部分,静态变量+dispatchonce(线程安全)争议部分,alloc/copyWithZone/mutableCopyWithZone的重写既然是在Cocoa下,当然要学习苹果怎么实现&... 查看详情

ios中的单例到底怎么写?

...模式自行百度。单例模式的好处自行百度。重点!iOS中的单例到底怎么写?无争议的部分,静态变量+dispatchonce(线程安全)争议部分,alloc/copyWithZone/mutableCopyWithZone的重写既然是在Cocoa下,当然要学习苹果怎么实现&... 查看详情

测试 Facebook 支付中的争议和退款

】测试Facebook支付中的争议和退款【英文标题】:TestingDisputesandRefundsinFacebookPayments【发布时间】:2012-10-2805:44:01【问题描述】:我们的应用即将推出,我们想测试争议/退款流程。我们已经进行了几次成功的测试付款,但我们不... 查看详情

团队开发过程中的一点感想

以前还不觉得单人开发和团队开发的区别有多大,以为顶多就是把一个人的任务分给了多个人而已,但是其实不然。我也是在经历过团队开发之后,才感觉到了单人开发与团队开发之间的重大区别(大致情况在后面说明),并不... 查看详情

苹果新算法已混进ios14.3!csam检测技术再遭网友争议

整理 |禾木木出品|CSDN云计算(ID:CSDNcloud)苹果宣布即将推出CSAM检测系统时,遭到了4000多个组织及个人的公开反对,他们质疑苹果会破坏用户隐私和端到端加密机制。一位Reddit用户发现CSAM算法竟已被悄悄地... 查看详情

苹果新算法已混进ios14.3!csam检测技术再遭网友争议(代码片段)

整理 |禾木木、郑丽媛出品| AI科技大本营(ID:rgznai100)苹果宣布即将推出CSAM检测系统时,遭到了4000多个组织及个人的公开反对,他们质疑苹果会破坏用户隐私和端到端加密机制。一位Reddit用户发现CSAM算法竟已... 查看详情

关于long的争议和思考

先普及一下VS开发Linux的知识点VS2017的安装:https://www.cnblogs.com/dunitian/p/8051985.html创建项目在这第一次运行的时候会让输入服务器信息(SSH连接)然后你去服务器看即可看见编译后的版本(写程序的时候win里面的一些东西就不要带... 查看详情

比java更具争议的php,处处留坑?

...范、核心异步网络不支持、后期维护困难等缺点,让不少开发者避之不及。不过,PHP经过了这么多年的发展,还是槽点满满吗?  你还记得几年前流行的那篇名为“全面解析PHP的糟糕设计 查看详情

补能的争议路线:快充会走向大一统吗?

...快充新闻引起了网友的热议:一个是日本电子零部件开发企业Eamex,其开发出高容量的电容器,如果用于纯电动汽车,最快1分钟即可完成充电。并且Eamex将于8月供应样品,准备开始量产。另外一则消息是宁德... 查看详情

响应式图片的3种解决方案

...式上存在一些争议。这些争议主要来自两方面:业界的web开发者和浏览器制造者。web开发者提议创建一个新的picture元素(类似HMTL5中的video这样的元素),该元素中包含其他的图片源,示例代码如下:·//codef 查看详情

eip1559协议争议几何

...包含区块BlockInclusion的“市场汇率”;2、销毁交易费中的大部分代币ETH。那为 查看详情

iOS 开发者计划中的多个帐户

】iOS开发者计划中的多个帐户【英文标题】:MultipleaccountsoniOSDeveloperProgram【发布时间】:2014-05-0210:25:16【问题描述】:我的公司为不同的客户开发应用程序,例如ClientA、ClientB和ClientC。我已经设置了我公司的iOS开发人员程序,... 查看详情

Ios开发中的定时动画

】Ios开发中的定时动画【英文标题】:TiminganimationinIosdevelopment【发布时间】:2014-09-1122:45:30【问题描述】:我正在寻找有关如何最好地为IOS应用程序实现卡拉OK文本效果的建议。我是IOS新手,所以不熟悉所有各种动画api和库,我... 查看详情

iOS开发中的条目列表

】iOS开发中的条目列表【英文标题】:ListofentriesiniOSdevelopment【发布时间】:2014-01-0412:30:17【问题描述】:我对iOS编程很陌生,我正在寻找一种方法来做某事。我想要一个带有条目列表的视图。在页面顶部,有一个+号用于添加新... 查看详情

演示 iOS 开发中的应用程序 [关闭]

】演示iOS开发中的应用程序[关闭]【英文标题】:DemonstratingiOSin-developmentapplication[closed]【发布时间】:2016-05-1815:50:01【问题描述】:我正在为我的客户开发iOS应用程序。最后,他让我通过链接分享应用的“预览”,然后他才能付... 查看详情

ios开发之--uitableview中的visiblecells的用法

先上图: 具体代码如下:#import"ViewController.h"@interfaceViewController()<UITableViewDelegate,UITableViewDataSource>@property(nonatomic,strong)UITableView*myTableV;@property(nonatomic,strong)NSArray* 查看详情

关于nft版权保护的争议

...术家的喜爱。同时,NFT 版权确权这一特性也被人们开发出来,已经在证书颁发、票据认证等领域有了很多应用。但另一方面,NFT 却又饱受版权问题的困扰。比如在不久前杭州互联网法院审理的一起关于“胖虎打疫... 查看详情

第十五课时之浮点数算法:争议和限制

...般情况下,你输入的十进制浮点数仅由实际存储在计算机中的近似的二进 查看详情