動態加載StoryBoard、xib

第一種方法:

ViewControllerB *vcB = [self.storyboard instantiateViewControllerWithIdentifier:@"Name of View Controller B"];

[vcB setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];

[viewControllerA presentModalViewController:(UIViewController *)vcB animated:YES];

接上一篇,通過學習上一篇,我們知道,XIB文件可以動態加載視圖,同樣功能強大的StoryBorad,更能出色地完成這一重任。此外其加載視圖的方式,有了更多的選擇,頗具有靈活性。

在storyBorad中可以結合XIB 文件使用,當然也可以動態地加載XIB 文件視圖,這個與在XIB文件中動態加載是一樣的,不熟悉的,可以看看我的上一篇博文。

直接進入正題,創建一個

勾選StoryBorad

//創建如下圖所示的界面文件,注意最後一個並沒有連接Segue,我們要手動地在程序中動態地加載這個界面文件

首先:我們先看一下XIB文件和storyborad中,一個UIViewControlelr 在其中顯示的形態有什麼不同,以及一些設置。

先看XIB中

再看StoryBorad中

細心的人會發現,兩個有一些細微的差別,剛開始學習的時候,沒有注意到,或者是,注意到了,也不知道怎麼使用,在storyborad中將NIB Name 替換成了Indentifier ,並且增加了一個 Initial Sence 選項,這個大家都明白.對於

Indentifier,就是我們今天動態加載視圖中的一個重要屬性標識。

好了,前期準備完畢,在storyborad中動態加載視圖,用到的一個類是顯而易見

UIStoryboard Class Reference

Getting a Storyboard Object

+ storyboardWithName:bundle: //獲得特定的storyBorad

Instantiating Storyboard View Controllers

– instantiateInitialViewController //返回初始化場景的controller

– instantiateViewControllerWithIdentifier: //返回指定的controller

相信這回大家該恍然大悟了,我們使用– instantiateViewControllerWithIdentifier:就可以獲得我們想要的任何UIViewController ,從而可以動態地加載。要注意在那個Indentifier選項中要標記好名字。

//簡單演示一下,拋磚引玉吧,

- (IBAction)shoudong:(id)sender {

NSLog(@”function %s line=%d”,__FUNCTION__,__LINE__);

UIViewController *con=[[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil] instantiateViewControllerWithIdentifier:@”dongtai”]; //獲得控制器

[self.navigationController pushViewController:con animated:YES]; // 加載控制器

}

點擊動態加載按鈕,看正確顯示我們的下一個視圖,這裏只是demo ,實際可以根據需要在特定場景加載特定的視圖,十分靈活,功能也十分強大。

總結:通過使用Interface Builder動態地加載視圖,更加熟悉了IB的使用,加深了印象,同時也提高了程序處理的靈活性。爲以後探索更加高級的應用打下了基礎。不斷研究,不斷總結,就會更快地進步。如有問題,歡迎留言交流。

寫在後面:此時動態加載視圖,注意和連線push的區別,使用過storyBorad的一看就會看出區別的。對比較,多分析。

IStoryboard *storyBoard=[UIStoryboard storyboardWithName:@"Storyboard" bundle:nil];

DetailViewController

detailViewController *

= [storyBoard instantiateViewControllerWithIdentifier:@"DetailViewController"];

這樣就好了





1、loadNibNamed方法:

-(NSArray *)loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)options

參數:

name:nib文件的名稱

owner:指定name參數所指代的nib文件的File's Owner

options:當nib文件開始時,需要的數據

返回值:返回符合對象的數組。

例子:初始化一個View

CustomCell *cell=(CustomCell *)[tableView dequeueReusableCellWithIdentifier:CustomCellTableIdentifier];

if (cell==nil) {

NSArray *nib=[[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];

cell=[nib objectAtIndex:0];// 因爲返回的是數組

}

在這個時候生成後會讓引用計數器變爲1,但是需要注意得,owner:self ,在owner自己dealloc得時候,系統會自動幫你將你自定義view引用計數器-1得。

特別注意:

loadNibNamed:owner:options: 這個函數會返回一個nib的數組。不過,在iPhone2.1包括以後的版本,這個數組的第一個元素,即nib[0]表示的就是除了File‘s Owner 和 File Responder後的第一個東西。在iPhon2.1之前的版本,nib[0]是File's Owner,nib[1]纔是除了File‘s Owner 和 File Responder後的第一個東西。

 

FOR EXAMPLE:

一個繼承uiview的類:


圖1

在xib中File‘s Owner的class設置爲SBVI,連接Outlets。則調用[[NSBundle mainBundle]loadNibNamed:@"SBVI" owner:sbviClass options:nil],即可完成sbviClass中的outlet對象初始化。()

此做法可以用於使用自定義方法(initWithSB:(NSString *)name;)創建SBVI對象,並使用xib文件初始化SBVI的subviews此時:

 
 圖2

這裏的View代表着SBVI對象的subviews。

 

而平時我關聯xib的方法是:


 圖3

這裏的Manage View代表的是ManageView對象本身。

不在File‘s Owner中關聯Outlets,在objects一欄中創建ManageView設置他的class爲要創建的類型( 這裏是ManageView),然後關聯他的Outlets,不同於上面的在File's Owner中關聯,而是在Objects中關聯。這樣調用[[NSBundle mainBundle]loadNibNamed:@"ManageView" owner:self options:nil],這裏的owner參數就無所謂了,隨便設置,(猜測)因爲我的xib文件中沒有對File‘s Owner的Outlets進行關聯。所以這句[[NSBundle mainBundle]loadNibNamed:@"ManageView" owner:self options:nil]是一次失敗的嘗試,它生成了對象但是沒有成功賦給別人。所以我需要先保存這些對象即使用數組對象接收:NSArray *nib=[[NSBundle mainBundle] loadNibNamed:@"ManageView" owner:self options:nil];數組中的元素是圖3中Objects一欄中的元素,注意,這裏並沒有包含ManageView中的節點元素,所以Objects個數是1,即nib數組的個數是1,且[nib objectAtIndex:0]即是圖3中的Manage View。此時寫manageView =[[nib objectAtIndex:0] retain];把xib中Objects中的對象賦給manageView。()

 

 btw:

http://blog.csdn.net/theonezh/article/details/7780495

http://tiny4cocoa.com/thread-2818-1-1.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章