gpt4 book ai didi

ios - 无需在 View Controller 中使用 loadFromNib 即可快速使用 Nib 自定义 UIView

转载 作者:搜寻专家 更新时间:2023-10-30 22:00:56 25 4
gpt4 key购买 nike

我一直使用 loadNibNamed 方法将自定义 View 加载到 View Controller 中,但现在我试图避免在自定义 View 之外调用该方法以使其更易于重用,这样如果其他人使用我的自定义 View 他只将需要在没有 loadFromNib 的情况下实例化 View ,例如:

var myView: MyView = MyView()

将此 View 添加到 View Controller 的 View 中就足够了,自定义 View 将在其内部加载 Nib 。我试图在 Swift 中做到这一点,在 ObjC 中我发现了类似这个答案之一的代码:UIView and initWithFrame and a NIB file. How can i get the NIB file loaded?但是很快我就不能使用答案中使用的初始化:

- (id)initWithFrame:(CGRect)frame 
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code.
//
[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil];
[self addSubview:self.view];
}
return self;
}

我有这个方法,它以无限循环结束:

override init(frame: CGRect) {
super.init(frame: frame)
self.loadFromNibNamed("MyView")
}

我也试过在 MyView 中添加另一个 View 作为 IBOutlet,就像其他答案所说的那样,并使用所有初始化:

@IBOutlet var view: UIView!

override init() {
super.init()
NSBundle.mainBundle().loadNibNamed("MediaPlayerView", owner: self, options: nil)
self.addSubview(self.view)
}

override init(frame: CGRect) {
super.init(frame: frame)
NSBundle.mainBundle().loadNibNamed("MediaPlayerView", owner: self, options: nil)
self.addSubview(self.view)
}

required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
NSBundle.mainBundle().loadNibNamed("MediaPlayerView", owner: self, options: nil)
self.addSubview(self.view)
}

但是还是报了死循环的错误。

我找不到好的解决方案,这让我发疯!!有人可以帮我吗?谢谢!

最佳答案

你得到了一个无限循环,因为 loadNibNamed(_,owner:,options:) 调用了一个 init,所以然后尝试再次加载 Nib ,然后再次等等......试试这个:

swift 4

var contentView: UIView?

// MARK: Initializers

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

required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
configureView()
}

override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
configureView()
}

override func awakeFromNib() {
super.awakeFromNib()
configureView()
}

// MARK: Config Functions

func configureView() {
guard let view = defaultView() else { return }
view.frame = bounds
view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
addSubview(view)
contentView = view

updateView()
}

func defaultView() -> UIView? {
// Create view from a nib with the same name
let nibName = String(describing: type(of: self))
let bundle = Bundle(for: type(of: self))
let nib = UINib(nibName: nibName, bundle: bundle)

return nib.instantiate(withOwner: self, options: nil).first as? UIView
}

这段代码的作用是从 nib 加载 View ,然后将其添加到 View 中的 subview 。

这也适用于在另一个 xibs 上添加您的 View ,添加 @IBDesignable 它将变得可用

关于ios - 无需在 View Controller 中使用 loadFromNib 即可快速使用 Nib 自定义 UIView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28105744/

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