1

我有一个小的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)

这是没有意义的,这是行不通的。

但是 t“是”视图,它是一个 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???"
4

1 回答 1

1

这段代码没有意义;您的使用t毫无意义:

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

提名 an 的目的owner是为一些已经存在的实例提供与nib 中的插座匹配的属性。这允许使用出口,并且可以通过名称立即引用它们所指向的视图。

这就是从情节提要加载视图控制器/视图对时发生的情况,也是情节提要以它们的方式工作的原因。视图笔尖与视图控制器一起加载为owner. 因此,如果视图 nib 具有 outletmySwitch并且视图控制器具有 outlet 属性mySwitch,则它们匹配并且self.mySwitch视图控制器实例可以使用该术语来指代开关。

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

例如(这是来自我的书,您可以自己下载并运行该示例):

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配置为将其File's Owner代理的类设置为 ViewController,并且如果您随后从File's Owner绘制了一个出口到视图并将该出口命名为coolview,当我们加载它时,它与coolview属性匹配,最后一个line works——我们可以将 nib-loaded 视图称为self.coolview.

请注意,我们不必像您一样捕获将 nib 加载为视图数组的结果,然后引用该数组的元素零。视图被插入到 namecoolview中。就是您加载笔尖以获得有用名称或名称的方式。

于 2017-01-14T17:17:26.880 回答