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
。 这 是您加载笔尖以获得一个或多个有用名称的方式。
我有一个小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
。 这 是您加载笔尖以获得一个或多个有用名称的方式。