如何在Interface Builder中添加NSHostingView并解决约束报错问题
问题根因
你当前错误的核心是使用了super.init(rootView: Circle())这个构造器初始化,该构造器会创建全新的NSHostingView实例,完全跳过了coder中存储的Storyboard配置(包括你在IB中设置的约束、视图层级关联等属性),导致IB中设置的约束引用了不存在于当前视图树的对象,触发非法约束报错。
解决方案
更换初始化逻辑,先调用父类的init(coder:)解码Storyboard中的视图配置,再手动给rootView赋值即可:
class HostedCircleView: NSHostingView<Circle> { required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) rootView = Circle() } }
补充说明
- 该实现要求最低部署目标为macOS 10.15 Catalina,和
NSHostingView的系统要求一致。 - 如果你需要给SwiftUI视图传递自定义参数,直接在赋值
rootView时配置即可,例如rootView = Circle().fill(.blue).stroke(.white)。 - 如果需要在Interface Builder中实时预览该视图,可以给
HostedCircleView加上@IBDesignable标记。
内容的提问来源于stack exchange,提问作者Damiaan Dufaux
相关产品推荐
相关产品推荐

