gpt4 book ai didi

ios - 如何允许子类使用父类的 nib

转载 作者:行者123 更新时间:2023-12-01 19:45:38 25 4
gpt4 key购买 nike

假设我有一个父 View 类,它至少包含 1 个属性:

  class BaseView : UIView {
@IBOutlet weak var myLabel: UILabel!
}

此类有一个对应的 xib 文件,其中包含从 xib 到 myLabel 属性的导出连接。

现在假设我们还有一些继承自这个类的子类:
  class ChildView : BaseView {
func setup() {}
}

ChildView 有一些自定义逻辑,但可以重用 BaseView 中的所有 View 。它没有(或者我宁愿避免它拥有)自己的相应 xib 文件。

我希望能够做这样的事情:
  let childView = Bundle.main.loadNibNamed(String(describing: BaseView.self), owner: nil, options:nil)?.first as! ChildViewA

但这不起作用。也没有:
  let childView = ChildView()
Bundle.main.loadNibNamed(String(describing: BaseView.self owner: childView, options: nil)

无论如何,是否允许 subview 以类似的方式从其父 View 的 xib 文件继承?

最佳答案

问题是 nib 中的 Root View 是 BaseView 类型。 , 所以 as! ChildViewA失败。由于您无权访问 NSKeyedUnarchiver nib 加载器用来解压缩 xib,在解压缩过程中没有简单的方法可以替换您自己的类。

这是一种解决方法。

不是 嵌入BaseView本身在xib中。相反,让 xib 中的顶级 View 成为一个普通的 UIView , 并将 File's Owner 自定义类设置为 BaseView .然后删除与顶层 View 的所有连接,并将它们设置为文件所有者。也给BaseView一个 rootViewFromNib导出,并将其连接到 Root View 。

然后,给 BaseView加载其 nib 并添加 rootViewFromNib 的初始化程序作为 subview ,其框架固定到 BaseView自己的bounds .您可以使用自动调整大小来做到这一点。

最后,BaseView应该是这样的:

class BaseView: UIView {

@IBOutlet var myLabel: UILabel!
// other outlets, etc.

@IBOutlet private var rootViewFromNib: UIView!

override init(frame: CGRect) {
super.init(frame: frame)

Bundle(for: BaseView.self).loadNibNamed("BaseView", owner: self, options: nil)
rootViewFromNib.frame = bounds
rootViewFromNib.autoresizingMask = [.flexibleWidth, .flexibleHeight]
rootViewFromNib.translatesAutoresizingMaskIntoConstraints = true
addSubview(rootViewFromNib)
}

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

}

BaseView.xib应该是这样的:

BaseView.xib

关于ios - 如何允许子类使用父类的 nib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48714685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com