loadNibNamed返回视图,而不是"视图"?

时间:2017-01-14 15:36:03

标签: xcode uiview swift3 loadnibnamed

我有一个小的xib,Teste.xib

enter image description here

归TesteView所有

class TesteView: UIView {
    @IBOutlet var tf:UITextField!
    @IBOutlet var sw:UISwitch!
    }

现在,我们要加载它(例如将其填充到堆栈视图中)。

let t:TesteView = TesteView()
let v = Bundle.main.loadNibNamed("Teste", owner: t, options: nil)?[0] as! UIView
v.heightAnchor.constraint(equalToConstant: 200).isActive = true
stack?.insertArrangedSubview(v, at: 3)
事实上,那很好。

一切正常。

但请注意,您插入" v",而不是" t"。 " V"不是" TesteView",它只是一些诅咒的观点在浮动。

如果您执行以下操作,

t.heightAnchor.constraint(equalToConstant: 200).isActive = true
stack?.insertArrangedSubview(t, at: 3)

没有意义,没有用。

但是"是"视图,它是一个UIView(实际上,它是一个TesteView)。它应该是你插入的东西。

所以你必须使用"两个不同的"事情......

t.tf.text = "WTF???"
// use "t" for that sort of thing
v.heightAnchor.constraint(equalToConstant: 200).isActive = true
v.backgroundColor = UIColor.blue
// but use "v" for that sort of thing
stack?.insertArrangedSubview(v, at: 3)

" t"似乎很奇怪和" v"不一样。

(事实上,如果TesteView甚至已经成为UIView的子类?也许它应该是别的东西 - 只是一个普通的类?它似乎不能真正用它作为一个视图所以WTF是它?)

这是什么交易和/或通常的成语是什么?

注意......

如今,没有理由这样做。只需使用一个小的UIViewController。几十年来,每个人都说"为什么苹果公司不允许你只通过id加载视图控制器?"现在你可以。没问题:

    let t = self.storyboard?.instantiateViewController(withIdentifier: "TesteID") as! Teste
    t.view.heightAnchor.constraint(equalToConstant: 200).isActive = true
    stack?.insertArrangedSubview(t.view, at: 3)
    t.tex.text = "WTH???"

1 个答案:

答案 0 :(得分:1)

这段代码毫无意义;你使用t毫无意义:

let t:TesteView = TesteView()
let v = Bundle.main.loadNibNamed("Teste", owner: t, options: nil)?[0] as! UIView

提名owner的目的是提供一些已经存在的实例,其中属性与nib中的 outlets 匹配。这允许使用出口,并且 name 可以立即引用它们所引导的视图。

当从故事板加载视图控制器/视图对时会发生这种情况,这就是为什么故事板以他们的方式工作的原因。视图nib将视图控制器加载为owner。因此,如果视图nib具有插座mySwitch并且视图控制器具有插座属性mySwitch,则它们匹配并且视图控制器实例可以使用术语self.mySwitch来引用该开关。

加载 .xib 文件时,您可以自己安排相同的事情。但你不是那样做的;你的代码只是故意愚蠢。

例如(这是我的书,你可以自己download and run这个例子):

class ViewController: UIViewController {
    @IBOutlet var coolview : UIView!
    override func viewDidLoad() {
        super.viewDidLoad()
        Bundle.main.loadNibNamed("View", owner: self)
        self.view.addSubview(self.coolview)
    }
}

如果您已将 View.xib 文件所有者代理的类设置为ViewController,那么如果您已经配置了 View.xib 文件所有者中抽取了一个插座并将其命名为该插座coolview,当我们加载它时,它与coolview属性相匹配,最后一行工作正常 - 我们可以将带有nib的视图称为self.coolview

请注意,我们永远不必捕获将nib作为一个视图数组加载的结果,然后像你一样引用该数组的元素零。视图会直接插入名称coolview是你如何加载一个笔尖以获得一个有用的名称。