-
Notifications
You must be signed in to change notification settings - Fork 11
Home
有时间听我讲讲这个模版的历史,这是抓住事物来龙去脉比较好的方法。
我从 2011 年末开始做 iOS 的外包项目直到 2014 年中,项目月均一个,本项目模版起源于此。这时期的模版主要提供项目起始的架子,上层功能很弱。
之后我加入了初创公司,开始近三年 996 的战斗模式,持续打磨一个 App,见证它从一个简单的社区应用,变成一个有着过百接口、超两百页面、包体积膨胀到 80 MB 的庞然大物。这时期的积累使得模版足以支撑中大型项目,功能也得到了极大的丰富,更重要的是树立正确的实现方式,这是模版描述中「iOS project done right」的根源。
在这两段工作经历中,都是小团队开发,iOS 团队从开始的一个人,到最后也不过四五人,不会涉及大厂完全隔离的模块模式。
2018 年至今,我又回到了外包的老路,但时间自由多了,可以花更多时间完善组件,让自己日后可以更懒。
经过多年的积累,模版包含的内容很多,有方方面面成体系的解决方案,大量可以拆成一个个三方库的组件,数量在一百左右。但东西多了理解就有难度了,随组件的文档不一定够,demo 仍不足。
从项目页看过去,Objective-C 占比很高,这是历史原因。核心业务组件已经基本改写成 Swift 了,新增组件也基本是 Swift 的。
关于用 Interface Builder 还是用代码写界面,Storyboard 在这里是最优先支持的。大量的组件应该也支持代码创建,但从没这么做过。
下载好后使用 bootstrap 脚本初始化,详见使用指南。
模版中所用的图片素材的 Sketch 稿,可以在版本发布页下载,名称为 UI.Assets.sketch
。
只要我还在做 iOS 开发,模版会保持维护的,但对于外部使用者,跟随升级不太容易。推荐的做法是用支持目录比较的工具,手动、挑有用的部分进行更新,我对旧项目就是这么做的。
更新的细节可看提交记录,每条日志我尽量写清楚。下面只列更新会影响使用,涉及兼容性的变更,并提供升级建议。另外 demo 分支可以看到版本更新做迁移的实例。
- HasItem、
ThrowExceptionToPause()
移入独立的包,需显式引入,用法没有变化; -
AppEnv
被 Swift 重写后的AppCondition
替代,定义方式、方法均有调整; -
MBControlGroup
被 Swift 重写后的MBGroupSelectionControl
替代,selectIndex
属性变为selectedIndex
,不再具有任何布局能力; - 账户系统重做,
MBUser
从实体变为IAAccount
界面,AccountManager
负责管理; -
MBBuildConfiguration
宏定义移除,新增 Swift 中的ALPHA
作为替代; - UserDefaults 存储定义升级为 Swift 写法,需要重写定义;
-
debugCommands()
定义方式变化,需要导入 Debugger 包、声明 vc 符合 DebugActionSource、方法更名为debugActionItems
; - 旧脚本系统重写替换,脚本目录名从
Scripts
更名为ci_scripts
; - 一些更名:
-
NSAccountDefaults
变为AccountDefaults
; - StoryboardCreation
identifierInStroyboard
=>identifierInStoryboard
; -
MBHightlightTintImageView
=>MBHighlightTintImageView
,属性hightlightTintColor
=>highlightTintColor
; -
ListStateView
,属性stautsLabel
=>statesLabel
;
-
- newFromStoryboard() 方法改为 Swift 实现,所有需要用的 vc 必须显示声明符合
StoryboardCreation
协议并设置 storyboardID; -
APIErrorDomain
更名为API.errorDomain
; - 一些错误的 complation 拼写被修正为 completion;
- MBFormFieldVerifyControl 的 invaild 属性、方法因修正更名;
- 通过 InterfaceBuilder 设置 UIViewController 样式的 IBInspectable 属性名全部去除 rf 前缀; * ViewController 朝向控制升级,字段名和取值都变了。
- Xcode 需求提升为 12+;
- 除个别例外,业务主要模块均改写为 Swift;
- MBCollectionView,底部刷新的加载方式变了,之前是定义在外部 xib 中,现在推荐在 Storyboard 中启用 setcion footer 将 footer 作为刷新指示器,supplementary view 的定制有更完善的 API 支持;
- MBCollectionView,不再设置 delegate 为自身;
- Xcode 12 IBDesignable 终于稳定可用了,涉及 UIEdgeInsets 的 IBInspectable 属性进行了重命名,影响到 MBButton、MBControlGroup、MBTextField;
- MBENVFlag 类型进行了调整,便于 Swift 中使用,现在是 OptionSet,可直接进行扩展,旧的地方全部需要调整;Objective-C 代码不能访问新的标志位,需重写或写死;
- 导航 URL 跳转 Swift 重写后,
AppNavigationJump()
需替换为NavigationController.jump(url:context:)
;pageURL 的隐式声明不再支持,需要的页面现在必须用AppPageURL
显式声明; - ZY 前缀的组件全部改为 MB;
- 一些不常用或过时的组件被移除;
- 颜色素材 Color 命名空间去除。
- API 用 Swift 重写了,
APIURLAssetsBase
常量去掉了,有需要重新定义即可,APIErrorDomain
更名为API.errorDomain
,图片加载的扩展去掉了,可直接用 SDWebImage 或 ZYImageView; - MBCollectionView 得到了完善,更接近 MBTableView。底部刷新采用安全的实现,不自动加载,需要在 IB 中自定义 section footer;
- MBControlGroup 及其子类的选中通知现在默认只在用户触发时调用(通过调整
selectionNoticeOnlySendWhenButtonTapped
的默认值); - MBFormSelectButton 支持 generics,在 Swift 中使用需修改声明;
- MBSearchTextField,doSearch 回调增加了用于区分是否自动搜索的参数;
- MBSearchViewController 不再设置默认的导航和状态栏样式;
- MBShareManager,现支持 WeChat SDK 1.8.6+;
- MBTableView
fetchItems(withPageFlag:)
重命名为fetchItems(nextPage:)
; - NSMilliDate 被移除,在整个应用中,如果日期格式一致,统一修改 JSONValueTransformer 实现即可;如果有多种日期格式,建议在模型上解析少见的格式;
- 代码组件、UI 素材的组织有调整;
- 颜色管理全面转用 asset catalog 管理,旧的颜色分类被移除。
- API 请求组件底层大升级,API 类提供了兼容接口,除了完成回调增加一个完成参数外基本无需修改,但建议尽快升级到新版接口;
- 导航样式默认无阴影,隐藏返回按钮标题。