ios - 用 Swift 中的另一个实例替换 UIView 的 self
问题描述
我想xib
在 Swift 中以编程方式初始化 -files,所以我创建了类MyView
。
的初始化xib
在方法中声明,在setup()
哪里loadNibNamed()
被调用。这将返回一个附加视图,我必须将其作为子视图添加到我的当前/初始视图中。
我在User Interface Inspector
后面看到的MyView
是初始视图,它当然也有自己的属性。我不喜欢这种行为,也不想修改属性两次。最后,我想实现初始化程序中的实例可以替换为通过调用创建的实例loadNibNamed()
;比喻的东西self = view
。
我添加了初始化程序和setup()
方法的代码。
required init?(coder aDecoder: NSCoder) {
NSLog("init with NSCoder")
super.init(coder: aDecoder)
}
init(in frame: CGRect) {
NSLog("init with CGRect")
super.init(frame: frame)
setup()
}
private func setup() {
NSLog("setting up")
let view = Bundle.main.loadNibNamed("MyView", owner: self, options: nil)!.first as! MyView
addSubview(view)
}
解决方案
您不能在初始化程序中用一个自我代替另一个自我。init
和 nib-loading 是相关的,但这种关系与您的提议相反:从 nib 加载视图将调用您的init(coder:)
.
您需要的不是初始化程序,而是工厂。
给 MyView 一个类方法 ( class func
),客户端可以调用它来加载 nib 并返回实例。
class func new() -> MyView {
let view = Bundle.main.loadNibNamed("MyView", owner: nil, options: nil)!.first as! MyView
return view
}
用法:
let v = MyView.new()
推荐阅读
- wagtail - Wagtail Form 静态字段和仅限超级用户的页面
- gitlab-ci - 带有 kustomize 的 ArgoCD 在运行时替换图像
- python - 我不断从抓取的网站获得太多链接
- python - 在python中计算FWHM
- javascript - 创建一个单例对象以跨不同页面保存数据
- javascript - 未能对存储在 localStorage 中的对象调用构造函数方法
- c# - 如何在不冻结应用程序 xamarin 表单的情况下添加很多孩子
- python - 在本地安装带有 pip3 的 python 包而不是以 root 身份安装 python 包时的 Python coredumps
- python - OpenCV 在我的 macOS 上安装后无法工作。谁能帮我吗?
- c - 覆盖率。配置覆盖率以检查声明的变量在用作指针之前是否已初始化