我总是使用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加载)