loadNibNamed returns 视图,而不是 "the view"?

loadNibNamed returns the view, not "the view"?

我有一个小xib,Teste.xib

归 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 的子class?也许它应该是其他东西 - 只是一个普通的 class?似乎不能真正将它用作这么看是什么鬼??)

这是怎么回事and/or常用的成语是什么?


注意...

如今,没有理由这样做。只需使用一个小的 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???"

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

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

提名 owner 的目的是提供一些已经存在的实例,其 properties 匹配 nib 中的 outlets .这允许使用 outlet,并且它们导致的视图可以立即被 name.

引用

这就是从情节提要中加载视图控制器/视图对时发生的情况,也是情节提要按照它们的方式工作的原因。视图笔尖与视图控制器一起加载为 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 并将其 文件所有者 代理的 class 设置为 ViewController,并且如果您随后从 File's Owner 绘制了一个出口到视图并将该出口命名为 coolview,当我们加载它时它与 coolview 属性 最后一行有效——我们可以将 nib-loaded 视图称为 self.coolview.

请注意,我们从来没有像您那样捕获将 nib 加载为视图数组的结果,然后引用该数组的元素零。该视图直接插入名称 coolview 是您加载笔尖以获得一个或多个有用名称的方式。