轉自http://blog.csdn.net/dongdongdongjl/article/details/7732774
近期在研究cocoa的窗口關係,發現之前寫過的一片文章在描述一個nib文件包含兩個或者兩個以上的窗口時如何實現的文章,寫的不清楚,並且很多概念上存在模糊的地方,通過近段時間的調測和學習,對於這部分可以說理解又深刻了一些,因此,在這裏從新補充和完善一些概念。
1、關於nib當中的窗口,對象的理解。
對於nib來說,你可以簡單的理解爲rc,但是這一點還不夠,其實nib是可以包含對象的,這句話的理解就是說,當一個nib文件被加載時,那麼nib文件當中所描述的窗口資源,對象資源都會被加載到內存當中,但是用不用是取決於開發人員的事情,因此,爲了節省內存空間。Cocoa官方的推薦方法是一個窗口對應一個nib,不會佔用過多的內存。
2、在nib當中的窗口,包含了NSWindow,NSPanel對象等等,他們對應的類,其實就是後臺的類,那麼這個類描述,其實只是一個資源類的描述,主要描述大小,標題,位置等等。而實際背後控制的類,叫做NSWindowController類,所以,在cocoa當中處處都存在MVC的設計思想。而且關鍵一點是隻有NSWindowsController類纔有showWindows的方法,並不是NSWindows本身去顯示自己的。
3、一個nib窗口如何解決兩個NSWindow對象的顯示問題?
具體方法:
step1、在nib的file owner類,提供兩個NSWindow的outlet,讓nswindows變成對象。
step2、使用nNSWdindowController控制你需要顯示的窗口即可。方法如下:
NSWindowController * controller = [NSWindowController alloc] initWithWindow :mywindow];
[controller showWindow:nil];
4、通常來講,多窗口的應用是使用多個nib文件的架構進行設計的,那麼具體設計方法如何哪?
說明:其實對於多個nib文件來說,有一個概念非常的重要,就是說一個nib是不能夠自動被加載的,他必須有一個能夠加載他的對象,而這個能夠加載他的對象,其實就是nib文件當中FILE'S OWNER對象,這個對象在nib來看是一個虛擬對象,也稱之爲佔位對象。但是對於外部來看,其實這個對象就是所謂的加載對象。還有一點就是說,加載對象,可以只完成加載的任務,也可以完成其他的功能,比如說IBAction,或者IBOutlet的功能等等。還有就是要補充一點,一旦nib被加載,nib當中所包含的所有對象都會被創建,並且可以使用。只是這個過程被cocoa隱藏在了後臺,所以程序的開發過程中,看不到有這樣的對象存在而已。
加載第二個nib文件的方法有很多,這裏簡單介紹三種。
第一個,
NSWindowController *controll=[[NSWindowController alloc] initWithWindows:mywindow];
第二個,
NSWindowController *controll = [[ NSWindowController alloc] initWithWindowNibName:@"nibname"]
第三個,
[NSBundle LoadNibNamed:@"nibname" owner : self];