XCode 13中无法将xib的outlet拖拽关联到自定义UIView子类
无法拖拽Outlet的遗漏配置与修复方案
你当前操作漏了3项关键配置,按以下步骤排查修复即可正常完成Outlet关联:
- 校验File's Owner的模块绑定:选中xib文件中的File's Owner,打开右侧身份检查器(Identity Inspector),在Class输入框下方的Module下拉选项中,手动选择当前项目target对应的模块,不要留空、不要使用Xcode自动推断的无关模块。Xcode 13.x版本普遍存在设置完类名后模块未自动匹配的bug,这是导致Xcode识别不到自定义类、无法拉线的最高发原因。
- 选对连线的宿主对象:xib文件结构中默认存在两个顶层对象:一个是你已经设置好类的File's Owner(类型为MyView),另一个是xib自带的根视图(默认类为系统UIView)。拖拽连线时不要把控件关联到根视图上,必须选中左侧文件树中的File's Owner作为宿主,再把控件的连线拖到MyView.swift的类定义大括号范围内,Xcode才会正常识别插入Outlet的选项。
- 补全xib加载的基础实现:你当前的MyView类为空实现,就算完成连线,运行时也会因为无法加载xib内容崩溃,需要在类中补全通用初始化逻辑,参考代码如下:
import UIKit class MyView: UIView { // 拖拽生成的Outlet会自动插入到这里 @IBOutlet weak var demoLabel: UILabel! override init(frame: CGRect) { super.init(frame: frame) loadNibContent() } required init?(coder: NSCoder) { super.init(coder: coder) loadNibContent() } private func loadNibContent() { let nibView = UINib(nibName: "MyView", bundle: nil).instantiate(withOwner: self, options: nil).first as! UIView nibView.frame = bounds nibView.autoresizingMask = [.flexibleWidth, .flexibleHeight] addSubview(nibView) } }
注意:如果你采用的是File's Owner绑定自定义类的方案,绝对不要把xib里的根视图class改成MyView,否则会触发初始化死循环。如果你更习惯直接把根视图类设为MyView,就不需要修改File's Owner的类,直接把Outlet连给根视图即可,两种方案二选一,不要混用。
- 如果完成上述配置后还是无法拖拽,按快捷键
Shift + Command + K清理项目构建缓存,重启Xcode后即可恢复正常。
内容的提问来源于stack exchange,提问作者sak
相关产品推荐
相关产品推荐

