我有一个小的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的子类?也许它应该是别的东西 - 只是一个普通的类?它似乎不能真正用它作为一个视图所以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???"
答案 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
。 那是你如何加载一个笔尖以获得一个有用的名称。