OC转Swift4后操作UIButton Outlet崩溃:unrecognized selector错误排查
解决OC转Swift4后操作Outlet崩溃的问题
我来帮你捋捋这个问题,把Objective-C类转成Swift4后遇到这种Outlet操作崩溃,还报[Controllet _mutableLayoutArrangements]: unrecognized selector sent to instance的错,其实大概率和布局或者类关联的问题有关,咱们一步步排查:
检查Storyboard/XIB里的ViewController类关联
转语言后很容易出现类名或者模块不匹配的情况:- 打开你的Storyboard/XIB,选中对应的ViewController
- 到Identity Inspector里确认Custom Class是你当前的Swift类,而且Module要选对(别选成原来的OC模块或者空着)
- 还要确保没有和原来的OC类同名的情况,避免Runtime混淆
排查Auto Layout约束问题
报错里的_mutableLayoutArrangements是Auto Layout的内部方法,说明布局约束可能出了问题:- 先暂时移除和
btnSelected相关的所有约束,再运行项目看看还会不会崩溃 - 如果不崩溃了,就重新添加合理的约束,注意不要设置循环约束,优先级也别冲突
- 也可以检查下整个ViewController的布局约束有没有异常,比如有没有约束指向了已经被删除的控件
- 先暂时移除和
调整Outlet的内存管理方式
Swift里IBOutlet默认是weak,但有时候可能因为内存提前释放导致崩溃,你可以试试:
把原来的代码:@IBOutlet var btnSelected: UIButton!改成:
@IBOutlet weak var btnSelected: UIButton?然后操作的时候用可选绑定:
if let btn = btnSelected { btn.isHidden = true }这样既能避免强制解包的风险,也能排查是不是控件被提前释放了
清理Xcode缓存
Xcode的缓存经常会导致各种奇怪的问题,试试这两步:- 清理Derived Data:打开Xcode的
Preferences->Locations,找到Derived Data的路径,打开文件夹删掉对应项目的缓存 - 清理Build文件夹:按下
Command+Shift+K,然后Command+B重新编译项目
- 清理Derived Data:打开Xcode的
检查OC和Swift混编的桥接问题
如果项目里还有OC代码,要确保桥接文件设置正确:- 确认Build Settings里的
Objective-C Bridging Header路径是对的 - 检查有没有重复的类名、方法名,避免符号冲突
- 确认Build Settings里的
你可以按照上面的顺序逐一排查,最可能的原因是布局约束异常或者类关联不匹配,毕竟报错直接指向了布局相关的内部方法。
内容的提问来源于stack exchange,提问作者Parv Bhasker
相关产品推荐
相关产品推荐

