參考文章
Storyboards Tutorial in iOS 7: Part 1
Storyboards Tutorial in iOS 7: Part 2
背景知識
Storyboard 在iOS5時(shí)引入炕横,它能節(jié)約你創(chuàng)建UI的時(shí)間控汉,先看一張storyboard的圖:看到它包颁,你就像看到了一張?jiān)O(shè)計(jì)圖蚕泽,一切已胸有成竹车吹!
storyboard與常規(guī)nib(nib文件后來改名叫xib文件眷蚓,小伙伴不用糾結(jié)它是啥)文件相比,有很多優(yōu)勢:
與散落的nib相比立倍,storyboard能給你一種全局感。
storyboard可以描述各種場景之間的過渡侣滩,這種過渡被稱作"segue",你通過簡單的ctrl-dragging就能搞定口注,減少代碼量。
storyboard支持table view的prototype cell君珠,這意味著你可以在storyboard中編輯cell寝志,減少代碼量。
當(dāng)然,世界上沒有完美的東西材部,由于Interface Builder還不夠強(qiáng)大毫缆,所以,有些nib能做到的乐导,storyboard還不能苦丁。而且,你需要一個(gè)更大的顯示器~
storyboard 把 view controller叫做:“scene”.
啟動(dòng)storyboard的系統(tǒng)預(yù)設(shè)
在工程plist中
storyboard操作
(iOS有所謂的三大container view controller物臂,分別是Tab Bar Controller旺拉,Navigation Controller,Split View Controller )
注意:在縮放的時(shí)候無法拖拽控件到畫板棵磷。
1.更改初始化視圖控制器
- 選擇初始化view controller蛾狗,選中相應(yīng)view controller ->
Attributes inspector
,勾選Is Initial View Controller
,如圖
-
直接拖拽初始化箭頭到相應(yīng)視圖控制器
如果更改了初始化的view controller,會(huì)發(fā)現(xiàn)初始化箭頭發(fā)生移動(dòng)仪媒,如圖:
2.添加Navigation Controller
- 選中要添加Navigation Controller的視圖控制器沉桌,在Xcode menubar選擇
Editor\Embed In\Navigation Controller
- 從Object Library拖拽
在storyboard的畫板上,會(huì)虛擬出一個(gè)Navigation Controller的scene规丽,它當(dāng)然不是一個(gè)真的UINavigationBar對象蒲牧,而是虛擬一個(gè),方便我們操作和理解赌莺。
當(dāng)我們點(diǎn)擊與Navigation Controller連接的視圖控制器,點(diǎn)擊Attributes inspector
松嘶,會(huì)發(fā)現(xiàn)Simulated Metrics
艘狭,如圖:
Inferred
是storyboard的缺省設(shè)置,這意味著該視圖控制器在Navigation Controller中時(shí),會(huì)展示一個(gè)navigation bar (當(dāng)然翠订,在其他container view controller中巢音,會(huì)展示相對的bar,比如尽超,在一個(gè)tab bar controller中會(huì)展示一個(gè)tab bar).Simulated Metrics
并不能用于runtime.
3.創(chuàng)建relationship segue
如圖所示:Ctrl-drag
官撼,從tab bar controller 連到navigation controller,松手,彈出 popup menu,如圖:
選擇Relationship Segue – view controllers
似谁,結(jié)果如圖:
4.命名tabbar controller和navigation controller中的bar item
并非在tabbar controller 里傲绣,而是在與其相連、對應(yīng)的controller里巩踏,如圖:5.自定義UI類
就像你不用storyboard一樣,創(chuàng)建一個(gè)類,當(dāng)然毅往,就不要勾選xib選項(xiàng)了牵咙,從storyboard的object library中拖拽出它的父類UI,在此UI的Indentity inspector中攀唯,將這個(gè)類與UI綁定洁桌,如圖:
6.在storyboard中找到相應(yīng)的視圖控制器
舉例,找到tab bar controller第一個(gè)tab————一個(gè)帶有導(dǎo)航欄的視圖控制器革答,
UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;
UINavigationController *navigationController = [tabBarController viewControllers][0];
PlayersViewController *playersViewController = [navigationController viewControllers][0];
7.Prototype cells
我們用static cells战坤,一般是這樣的:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier];
}
// Configure the cell...
return cell;
}
用Prototype cells是這樣的:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"PlayerCell"];
// Configure the cell...
return cell;
}
我們選中控制器的tableview空間,第一個(gè)就是cell的選擇残拐,如圖:
默認(rèn)是prototype cell.
有沒有想過把prototype cell 用在不同的table view 中途茫?我這樣想過,了解了一下溪食,發(fā)現(xiàn)目前storyboard還不支持囊卜,如果想曲線救國,實(shí)現(xiàn)起來挺復(fù)雜的错沃,參見Reusable UITableView's prototype cell栅组。
8.Static Cell
如果用static cell,我們就不用為tableview創(chuàng)建data source枢析,因?yàn)樗褪莻€(gè)靜態(tài)的cell,不需重用玉掸,所以,你可以把該cell上的UI控件拖拽到對應(yīng)的controller(Prototype cell是不行的)醒叁,如圖:
9.添加bar button item 到導(dǎo)航欄
拖拽一個(gè)bar button item 到擁有導(dǎo)航欄的控制器上司浪,而不是那個(gè)虛擬的navigation controller.
10.segue
我們在前面說過container view controller 有一種relationship segue,它表示一個(gè)container view controller上所擁有的view controller,另外把沼,就是用于view controller之間過渡的segue啊易,它可以由button,cell,gesture等等來觸發(fā)。
它的優(yōu)勢在于饮睬,節(jié)省很多代碼量租谈,很直觀,你不用再寫什么方法捆愁,或者像xib那樣連接諸如IBAcation之類的東西割去。
- 操作segue
例如:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"AddPlayer"]) {
UINavigationController *navigationController = segue.destinationViewController;
PlayerDetailsViewController *playerDetailsViewController = [navigationController viewControllers][0];
playerDetailsViewController.delegate = self;
}
}
注意:記得給segue添加Identifier