【发布时间】:2015-03-22 05:55:02
【问题描述】:
我一直使用 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 就像另一个答案所说的那样,并使用所有的 inits:
@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)
}
但还是报了无限循环的错误。
我找不到一个好的解决方案,这让我发疯了!!有人可以帮助我吗?谢谢!
【问题讨论】:
-
您的NIB 是否包含
MyView或MediaPlayerView类的视图?这可能是无限循环的原因,我猜init(coder:)是原因。