StoryBoard配置

Storyboard是iOS5的新特性。使用Storyboard能夠更方便的管理應用的界面,同時爲視圖間的跳轉提供了清晰的脈絡。app

任什麼時候候你均可以在你的項目中添加Storyboard,無論你建立項目的時候有沒有勾選「Usb Storyboard」選項,以下圖所示。框架

若是你建立的時候勾選了該選項,那麼恭喜你,你已經有了一個Storyboard,而且被設爲了Main Storyboard,以下圖所示。ide


同時你的代理類是這樣的:atom

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {spa

return YES;代理

}code


這跟之前可大不同了!這是由於程序會自動加載Main Storyboard。若是你把上面的Main Storyboard項清空了,那咱們的MainStoryboard.storyboard就是一個孤立的文件了,你必須手動加載它,因此上面的代碼也 得改一改,以下:orm

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions對象

{事件

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];

self.window.rootViewController = [storyboard instantiateInitialViewController];

[self.window makeKeyAndVisible];

return YES;

}


上面加粗的兩句比較重要,前一句是從文件建立UIStoryboard實例對象,後一句則是從這個對象裏獲取「初始視圖控制器」(一個 storyboard裏只能夠設置一個初始視圖控制器,至關於這個storyboard的入口,後面還會說到)。 但若是你建立項目的時候沒有勾選「Use Storyboard」項,那你就要手動添加Storyboard了,以下圖所示。



手動建立的Storyboard和自動建立的沒有任何不一樣,打開咱們剛剛建立的Storyboard,裏面什麼都沒有,咱們不妨拖拽一個Navigation Controller到裏面。



能夠看到咱們一次拖出了兩個視圖控制器,這是由於Navigation Controller須要一個rootViewController。注意我標註的兩個小箭頭,左邊的表明這是一個「初始視圖控制器」,右邊的表明兩個視 圖控制器之間的關係。選中視圖控制器可查看屬性。



取消勾選「Is Initial View Controller」後指向視圖控制器的箭頭也就消失了。再次說一下,一個Storyboard裏只能有一個「初始視圖控制器」。

下面要作的是在根控制器中添加一個button,而後繼續拖拽一個ViewController,點擊button新ViewController push進來。

首先添加button,就跟使用IB同樣。此次咱們拖拽一個UITabbarController,這時以下圖所示。

接下來有兩種方法: 第一種:咱們能夠直接在Storyboard中完成,按住ctrl從button鏈接到TabbarController,鬆開並選擇push,這樣咱們就建立了一個segue(UISotryboardSegue)。

保存並運行



咱們沒有寫任何代碼就已經完成了一個簡單的框架。

下面是第二種方法:咱們準備用代碼來實現。(記得把上一步中push類型的segue刪除。)首先建立類 FirstViewController(Subclass of UIViewController),而後將RootViewController的底層類改成FirstViewController,以下圖。


繼續選中TabbarController,並設置Identifier爲「second」。



在FirstViewController.m中添加下面的方法並鏈接到button。

- (IBAction)pressed

{

UIStoryboard *board=[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];

UITabBarController *nextViewController =[board instantiateViewControllerWithIdentifier:@"second"];

[self.navigationController pushViewController:nextViewController animated:YES];

}

加粗的代碼展現瞭如何使用Identifier從Storyboard中獲取指定的視圖控制器。保存並運行,效果和前一種方法徹底相同。

下面咱們將完成另外一個目標:手動觸發一個segue。(Storyboard裏沒法建立一個經過touch來觸發的segue。)

拖拽一個UIViewController,按住ctrl從TabbarController的第一個分支鏈接到新的viewController,一樣選擇push。



選擇剛剛建立的segue並設置Identifier爲「touch to push」,而後設置新viewController的Identifier爲「third」。(Identifier只是一個名稱沒有實際意義,能夠隨便設置。)

添加新類SecondViewController(Subclass of UIViewController),選中第一個分支並設置其底層類爲SecondViewController。而後添加以下方法。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

[self performSegueWithIdentifier:@"touch to push" sender:nil];

}

明白這個方法後就能夠用任何類型的事件去觸發咱們在Storyboard中建立的segue了。

繼續下一個目標:在segue被觸發的時候傳遞參數到目標視圖控制器。

刪除TabbarController的第二個分支,拖拽一個UITableViewController,按住ctrl從 TabbarController鏈接到UITableViewController,鬆開並選擇relationship。選中cell設置 Identifier爲「cell」。而後再拖拽一個UIViewController,並添加一個UILabel。做以下操做。



添加類ThirdViewController(Subclass of UITableViewController)和類FourthViewController(Subclass of UIViewController),分別設置爲最後兩個視圖控制器的底層類。

ThirdViewController.m

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

return 20;

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

static NSString *identifier = @」cell「;

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];

if (cell == nil) {

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];

}

cell.textLabel.text = [NSString stringWithFormat:@"%d",indexPath.row];

return cell;

}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

{

//這裏我很謹慎的對sender和目標視圖控制器做了判斷

if ([sender isKindOfClass:[UITableViewCell class]]) {

if ([segue.destinationViewController isKindOfClass:[FourthViewController class]]) {

NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];

FifthViewController *nextViewController = segue.destinationViewController;

nextViewController.string = [NSString stringWithFormat:@"%d",indexPath.row];

}

}

}

FourViewController.h

@interface FifthViewController : UIViewController

{

IBOutlet UILabel *label;

}

@property (nonatomic,strong) NSString *string;

FourthViewController.m

@synthesize string;

- (void)viewWillAppear:(BOOL)animated

{

[super viewWillAppear:animated];

label.text = self.string;

}

segue包含屬性sourceViewControllerdestinationViewController。segue在觸發後但還未執行的時候會調用sourceViewController的prepareForSegue:sender:方法,sender是segue的起始點,能夠是button、cell等等。這是你傳遞參數最好的時機,你能夠利用sender參數來找到是哪一個cell被點擊,利用segue參數來獲取源視圖控制器對象和目標視圖控制器對象,這樣你就有足夠的信息來傳遞參數了。

保存並運行

相關文章
相關標籤/搜索