2017-01-14 137 views
1

我有一個小的廈門國際銀行,Teste.xibloadNibNamed返回視圖,而不是「視圖」?

enter image description here

通過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???" 
+0

可能,您不希望爲_File的Owner_使用自定義類,而是爲視圖本身使用自定義類。 – holex

+0

http://stackoverflow.com/a/41637916/2019221 – Callam

+0

您可以將插座連接到_View_而不是_File的Owner_,但程序非常相似。 – holex

回答

1

這段代碼沒有意義;您的t使用是沒有意義的:

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

提名的owner的目的是提供一些已經存在的實例與性質匹配網點在筆尖一點。這允許使用插座,並且他們所引導的視圖可以立即通過名稱來提及。

這是從故事板加載視圖控制器/視圖對時發生的情況,也是故事板爲何如此工作的原因。視圖筆尖以owner加載視圖控制器。因此,如果視圖筆尖具有插座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文件的所有者代理的班級設置視圖控制器,然後如果您已經從文件的所有者中抽出一個插座並將其命名爲outlet,那麼當我們加載它時與coolview屬性匹配並且最後一行工作 - 我們可以參考加載了筆尖的視圖如self.coolview

請注意,我們從來沒有必要捕獲將nib作爲視圖數組加載的結果,然後像您那樣引用該數組的元素0。該視圖獲得了名稱coolview的名稱。 是如何加載一個筆尖,以獲得一個有用的名稱或名稱。

+0

對不起。我的觀點只是,你不會像創建代碼一樣僅僅添加一個「拖把」來訪問這些插座,然後把這個UIView放開,就像你一樣。你通過故意製作一個愚蠢的例子「堆積了甲板」。在_my_示例中,所有者已經存在。 – matt

+0

而我完全不同意「時下」。我一直使用_xib_文件。故事板是工具箱中的另一個工具,但他們沒有推出我的其他工具。 – matt

+0

好吧我會試着去了解.......... – Fattie

相關問題