我在Swift项目中加载xib文件时遇到了一些奇怪的问题。这让我感到非常沮丧,因为我已经知道如何在Obj-C中做到这一点。但是由于Swift是Swift,所以你不能像以前那样做...:/
因此,我创建了IconTextFiled.xib和IconTextField.swift文件(继承自UITextField)。在xib文件中,我在Identity Inspector中填写了字段类,并在storyboard中为某些textField重复此操作。所以我们只需在init方法中添加从xib加载的内容即可吗?不。
在Objc中,我会这样做
- (instancetype)initWithCoder:(NSCoder *)coder
{
self = [super initWithCoder:coder];
if (self) {
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"IconTextField" owner:self options:nil];
self = [nib objectAtIndex:0];
}
return self;
}
所以我想,如果我将其翻译成Swift,那就好了。
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
let nib:NSArray = NSBundle.mainBundle().loadNibNamed("IconTextField", owner: self, options: nil)
self = nib.objectAtIndex(0)
}
但那并不起作用。我不知道为什么,但它试图创建更多的对象并崩溃了。
最后我找到了扩展。
extension IconTextField {
class func loadFromNibNamed(nibNamed: String, bundle : NSBundle? = nil) -> IconTextField? {
return UINib(
nibName: nibNamed,
bundle: bundle
).instantiateWithOwner(nil, options: nil)[0] as? IconTextField
}
}
所以在ViewController中看起来像是这样
@IBOutlet var password: IconTextField!
override func viewDidLoad() {
super.viewDidLoad()
password = IconTextField.loadFromNibNamed("IconTextField")
}
再次失败。您能告诉我如何加载和使用xib文件吗?
更新
好的,按照丹尼尔的回答:
我的当前代码:
class IconTextField: UITextField {
@IBOutlet var icon: UIImageView!
@IBOutlet weak var view: UIView!
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
NSLog("initWithCoder \(self)")
NSBundle.mainBundle().loadNibNamed("IconTextField", owner: self, options: nil)
self.addSubview(view)
}
}
这两个变量与这些视图相关联。
控制台输出很大,以EXC_BAD_ACCESS
结尾。
2014-10-24 10:09:09.984 testproject[20337:3757479] initWithCoder <stensgroup.IconTextField: 0x7be7bfb0;>
2014-10-24 10:09:09.984 testproject[20337:3757479] initWithCoder <stensgroup.IconTextField: 0x7be7ddf0;>
2014-10-24 10:09:09.985 testproject[20337:3757479] initWithCoder <stensgroup.IconTextField: 0x7be7fa20;>
2014-10-24 10:09:09.985 testproject[20337:3757479] initWithCoder <stensgroup.IconTextField: 0x7be814f0;>
2014-10-24 10:09:09.986 testproject[20337:3757479] initWithCoder <stensgroup.IconTextField: 0x7be830c0;>
2014-10-24 10:09:10.083 testproject[20337:3757479] initWithCoder <stensgroup.IconTextField: 0x7d183270;>
2014-10-24 10:09:10.084 testproject[20337:3757479] initWithCoder <stensgroup.IconTextField: 0x7d187cd0;>
2014-10-24 10:09:10.084 testproject[20337:3757479] initWithCoder <stensgroup.IconTextField: 0x7d189960;>
应该只有两个initWithCoder。似乎func loadNibNamed正在调用initWithCoder
UITextField
这样做?我曾经看到过对UITableViewCells
这样做,但从未见过对文本字段这样做。 - Daniel T.IconTextField
将具有UIImageView
作为图标。这样我就不必每次都附加UIImageView
。 - Błażej