Xcode loadNibNamed返回视图,而不是";“观点”是什么;?

Xcode loadNibNamed返回视图,而不是";“观点”是什么;?,xcode,uiview,swift3,loadnibnamed,Xcode,Uiview,Swift3,Loadnibnamed,我有一个小的xib,Teste.xib 由TesteView所有 class TesteView: UIView { @IBOutlet var tf:UITextField! @IBOutlet var sw:UISwitch! } 现在,我们将加载它(例如,在堆栈视图中填充它) 事实上,那很好 一切正常 但请注意,您插入的是“v”,而不是“t”。“v”不是“测试视图”,它只是一些该死的视图在四处浮动 如果您执行以下操作 t.heightAnchor.constra

我有一个小的xib,Teste.xib

由TesteView所有

class TesteView: UIView {
    @IBOutlet var tf:UITextField!
    @IBOutlet var sw:UISwitch!
    }
现在,我们将加载它(例如,在堆栈视图中填充它)

事实上,那很好

一切正常

但请注意,您插入的是“v”,而不是“t”。“v”不是“测试视图”,它只是一些该死的视图在四处浮动

如果您执行以下操作

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???"

这个代码毫无意义;您使用
t
是毫无意义的:

let t:TesteView = TesteView()
let v = Bundle.main.loadNibNamed("Teste", owner: t, options: nil)?[0] as! UIView
指定
所有者的目的是为一些已经存在的实例提供与nib中的Outlet匹配的属性。这允许使用插座,并且可以立即通过名称引用插座所指向的视图

这就是从序列图像板加载视图控制器/视图对时发生的情况,也是序列图像板工作方式的原因。视图nib以所有者身份加载视图控制器。因此,如果视图nib具有outlet
mySwitch
,并且视图控制器具有outlet属性
mySwitch
,则它们匹配,并且视图控制器实例可以使用术语
self.mySwitch
来指代开关

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

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

如果已将View.xib的文件所有者代理类设置为ViewController,并且随后已将文件所有者的出口绘制到视图并命名为该出口
coolview
,当我们加载它时,它与
coolview
属性匹配,最后一行工作-我们可以将nib加载的视图称为
self.coolview


请注意,我们从来不需要像您一样捕获将nib作为视图数组加载的结果,然后引用该数组的元素0。视图被直接插入名称
coolview
。这就是加载nib以获得一个或多个有用名称的方法。

可能您不想将自定义类用于文件的所有者,而是用于视图本身。您可以将插座连接到视图,而不是文件的所有者,但过程完全相同。@JoeBlow,是的,把emtpy字段留在文件的所有者那里。哇,没有了吗?很抱歉。我的观点是,你不会在代码中创建一个UIView,只是为了添加一个“mop”来访问outlets,然后像你一样扔掉那个UIView。你故意做了一个愚蠢的例子,这是在“堆积如山”。在我的例子中,所有者已经存在。我完全不同意“现在”。我一直在使用xib文件。故事板是工具箱中的另一个工具,但它们并没有淘汰我的任何其他工具。如果这是真的,也许你会读我的在线书籍,其中解释了所有这些:但这也是有问题的;您不应该使用视图控制器对nib进行“转储程序潜水”。您不能随意将视图控制器的视图扔到接口中。
let t:TesteView = TesteView()
let v = Bundle.main.loadNibNamed("Teste", owner: t, options: nil)?[0] as! UIView
class ViewController: UIViewController {
    @IBOutlet var coolview : UIView!
    override func viewDidLoad() {
        super.viewDidLoad()
        Bundle.main.loadNibNamed("View", owner: self)
        self.view.addSubview(self.coolview)
    }
}