gpt4 book ai didi

ios - 快速加载 xib 文件的正确方法

转载 作者:IT王子 更新时间:2023-10-29 05:21:28 27 4
gpt4 key购买 nike

我在 swift 项目中加载 xib 文件时遇到一些奇怪的问题。这太令人沮丧了,因为我已经知道如何在 Obj-C 中做到这一点。但是因为 swift 是 swift 所以你不能像你那样做.. :/

所以我创建了 IconTextFiled.xib 和 IconTextField.swift。 (扩展 UITextField)在 xib 中,我在身份检查器中填写字段类,在 Storyboard 中,我对某些文本字段执行相同的操作。那么我们可以直接将 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 文件的吗?

更新

好的,跟随 Daniel anwser

我当前的代码

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)
}
}

enter image description here

这两个变量连接到那些 View

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", owner: self, options: nil)
self.addSubview(view)
assert(test != nil, "the button is conected just like it's supposed to be")
}
}

一旦 loadNibNamed:owner:options: 被调用,viewtest 按钮就会按预期连接到 socket 。添加 nib 的 View 自身的 subview 层次结构使 nib 的内容可见。

关于ios - 快速加载 xib 文件的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26539849/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com