ios – 在视图控制器中不使用loadFromNib而在swift中使用Nib自定义UIView

我总是使用loadNibNamed方法自定义视图加载到视图控制器中,但现在我试图避免在自定义视图之外调用方法使其更可重用,这样如果另一个人使用我的自定义视图,他只需要在没有loadFromNib的情况下实例化视图,例如:
var myView: MyView = MyView()

将视图添加到视图控制器的视图就足够了,自定义视图会将nib加载到其自身内部.
我试图在Swift中做到这一点,在ObjC中我发现了代码就像这个答案:UIView and initWithFrame and a NIB file. How can i get the NIB file loaded?
但是在swift中我不能使用答案中使用的init:

- (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中添加一个视图作为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",options: nil)
    self.addSubview(self.view)
}

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

但仍然得到了无限循环的错误.

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

解决方法

我认为更干净的方法是不使用认初始值设定项,而是使用自己的认初始值设定项.像这样
override init(frame: CGRect,shouldLoadFromNib: Bool) {
    super.init(frame)
    guard shouldLoadFromNib else {
         return
    }
    NSBundle.mainBundle().loadNibNamed("MediaPlayerView",options: nil)
    self.addSubview(self.view)

}

这样,当你从其他地方实例化它时,你会立即看到这不仅是一些UIView的普通旧实例,而且它有副作用(视图将从一个nib加载)

我不确定super.init(frame)调用,loadNibNamed可能也会为你调用,所以你可能想检查一下

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...