怎么讓繼承的類直接使用XIB的布局試圖
最近做的一個小工具,一鍵替換key,就是為了解放雙手,不然每次運行測試和正式的版本都要手動的替換key。
自從2013年三月進入一家外企之后,就再也沒有用過xib.雖然現在蘋果已經建議大家用Storyboard
但是一些地方還是要用到xib
.
自己幾乎所有的項目都是用的全代碼,但是平時demo和一些小工具還是用上可視化試圖和最新語言Swift
.
做到是一個mac程序,幾個界面基本上的功能按鈕都是一樣的。就封裝了一個類,用上了xib。但是拖拽一個NSView
,繼承與我們剛才的自定義試圖,運行發現出不來我們XIB界面。
我自己分析了一下原因,雖然我們讓XIB的類指向我們自己自定義試圖,但是關聯不起來試圖。應該沒有加載,我最初想到的解決在
override init(frame frameRect: NSRect)
required init?(coder: NSCoder)
這兩個方法里面讀取Nib
里面的試圖獲取到設置為自定義試圖的大小。
最后對于Xib
這一塊不是很熟悉就沒走通,后來經過搜索,解決了我的問題。大體上解決方法和我想的是一樣的。
下面是怎么實現的,看不了視頻的可以看我的。
新建一個OToolBarView
類繼承于NSView
.
class OToolBarView: NSView {
}
因為Storyboard
不允許直接拖拽NSView
,允許我們拖拽NSViewController
。但是我們的是自定義試圖,用不上NSViewController
。就新建一個xib來做了。
名字命名為OToolBarView.xib
我們在xib
里面關聯剛才創建的類。
我們設置里面的View關聯為OToolBarView
的一個屬性
@IBOutlet var view: OToolBarView!
新增一個方法來加載自定義試圖
func loadNibView() {
Bundle.main.loadNibNamed("OToolBarView", owner: self, topLevelObjects: nil)
self.view.frame = self.bounds
self.addSubview(self.view)
}
我有點不理解為什么執行了Bundle.main.loadNibNamed("OToolBarView", owner: self, topLevelObjects: nil)
這個方法之前設置的屬性View
就存在值了,有點不理解。
還有這個類型AutoreleasingUnsafeMutablePointer
應該像Object-C
的自定義釋放的類型。以后研究一下這個類型。
我們在我們必要的的兩個初始化方法里面進行調用loadNibView
override init(frame frameRect: NSRect) {
super.init(frame: frameRect)
self.loadNibView()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
self.loadNibView()
}
我們運行之后就可以顯示出來了。