ios – Swift正确的方式来加载xib文件

我在 swift项目中加载xib文件有一些奇怪的问题.这是非常令人沮丧的,因为我已经知道如何在Obj-C.但是因为迅捷是迅速的,所以你不能像你这样做.. .. /

所以我创建了IconTextFiled.xib和IconTextField.swift. (扩展UITextField)在xib我填充字段类在Idenity检查器和在故事板我做同样的一些textFields.所以我们很好,只需要从xib加载到init方法?没有.

在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文件

UPDATE

好吧,跟随丹尼尔之后

我当前的代码

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",options: nil)
        self.addSubview(view)
    }   
}

那两个var连接到这些视图

Consoleo输出,大大多了,以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

解决方法

这对我有用:
class IconTextField: UITextField {
    @IBOutlet weak var view: UIView!
    @IBOutlet weak var test: UIButton!

    required init(coder: NSCoder) {
        super.init(coder: coder)
        NSBundle.mainBundle().loadNibNamed("IconTextField",options: nil)
        self.addSubview(view)
        assert(test != nil,"the button is conected just like it's supposed to be")
    }
}

一旦loadNibNamed:owner:options:被称为视图和测试按钮按预期连接到插座.添加笔尖的视图自己的子视图层次结构使得笔尖的内容可见.

相关文章

背景 前端时间产品经理决定使用百度统计,使得 工程B 中原统计sdk-友盟统计,需要被去除。之前尝试去除...
结论: alloc负责分配内存和创建对象对应的isa指针; init只是返回alloc生成的对象。 所以alloc后,多次...
更新 如果UI愿意把启动图切割成n份,按一定约束在launchscreen.storyboard中进行排版,启动图效果会更好...
最近在看一本书《Effective OC 2.0》,今天看到有个tip是OC适中循环各自优劣性,作者最终推荐此块循环。...
// // ViewController.m // paintCodeTestOC //gif // Created by LongMa on 2019/7/25. // #import &a...
背景介绍 一般情况下,出于省电、权限、合理性等因素考虑,给人的感觉是很多奇怪的需求安卓可以实现,但...