解决FDStackView在Swfit下的Bug一则
Apple在iOS 9推出了UIStackView,使得线性布局变得简单易行,再也不用劳神劳力的手写Frame,或者用UITableView / UICollectionView这种大家伙实现简单的布局结构了。美中不足的是,这个控件目前只支持iOS 9,因此,ForkingDog团队推出了FDStackView这个框架,只需简单的集成进项目,即可使UIStackView支持到iOS 6,真是神器。经过简单的了解,发现他是通过运行时注入的手段来达到这一目的,在OC下使用暂时没有问题,可是到了Swift(因为Swift对运行时的处理方式同OC有区别),就会出现一些问题。
Bug描述
-
发生环境
:Swfit + iOS8.1 + 代码创建UIStackView -
表现
:程序崩溃,停留在使用UIStackView那一行代码,提示Bad Access
解决过程
首先百度“FDStackView + Swift”,然而并没有什么相关的结果。直接跑到FDStackView的GitHub页面,在issues一栏,发现了一些端倪:
-
在这里,有人说在Swfit下,iOS8.1,8.2会崩溃,而iOS8.4没问题。
-
作者没有回答这个
issue
,但是提问者说利用OC代码返回一个UIStackView实例,问题得到了解决,并给出了一个例子:+ (UIStackView *)stackView { return [[UIStackView alloc] init]; }
-
并且提问者还补充,如果是使用
cocoaPods
集成的FDStackView
,则会由于动态库
的原因,上面的OC代码会返回nil
。所以需要以静态库
的方式调用FDStackView(我个人还没有搞清楚两者的区别)
解决方法
在进行若干次尝试后,终于成功解决了问题,具体步骤如下:
-
删除cocoaPods所集成的FDStackView,具体方法为:
- 删除
Podfile
中关于FDStackView
的内容 - 在终端内执行
pod install --verbose --no-repo-update
- 命令执行完毕,框架就被删除了
- 删除
-
下载
FDStackView
的代码,手动拖入项目中 -
在桥接文件内导入
FDStackView.h
-
创建一个OC类,名为XXStackView,继承自
FDStackView
,什么内容都不用写(通过测试,不用写上面的代码,这样也最省事),并将其头文件写入桥接文件 -
项目中所有需要使用代码创建
UIStackView
的地方都适用XXStackView
,但Xib
中依然可以直接使用UIStackView
后记
通过查询, FDStackView貌似貌似是通过插入內联汇编代码的方式来将自己替换
UIStackView
的,具体讨论可以参看一下文章:
网友评论