1. 程式人生 > >Xcode -(OC版)Storyboard教程 1.5:Segues的介紹

Xcode -(OC版)Storyboard教程 1.5:Segues的介紹

con .cn 自動 參數 bar atom 繼承 彈出 rop

1 - 現在,讓我們創建一個場景使用戶可以自己增加新的選手進入列表,在 Player 界面中拖入一個 Bar Button,放置在導航欄的右側,在屬性監視器中將它的 System Item 改為『add』,這樣它就會顯示一個加號的按鈕:當用戶點擊這個按鈕時,它就會彈出一個新的場景讓用戶對新的內容進行編輯或添加

技術分享

2 - 在編輯器中拖入一個新的 Table View Controller,放置在 Players 場景的右邊,然後按住 ctrl,拉動加號鍵到新的場景中,放開鼠標之後,會出現如下選項

技術分享

3 - 選中 Modal,你可以註意到出現了一種新的箭頭形式

技術分享

4 - 這樣,這個場景就會自動和這個按鈕建立聯系,從而自動歸入 Navigation ,這種鏈接形式被官方稱為 segue(pronounce: seg-way

註: - segue 表面翻譯是聯線的意思,其實它的意思是轉換,這它表示從一種場景轉換到另外一種場景中,之前我們使用的連接都是描述一種場景包含另一種場景的。而對於聯線來說,它會改變屏幕中顯示的內容,而且必須由交互動作觸發:如輕點,或其他手勢

   - 聯線真正了不起的地方在於:你不再需要寫任何代碼來轉入一個新的場景,也不用在將你的按鈕和 IBAction 連接到一起,我們剛才做的,直接將按鈕和場景鏈接起來,就能夠完成這項工作

5 - 運行這個app,按下 + 鍵,會發現出現了一個新的列表

技術分享 技術分享

       點『+』擊前                       點『+』擊後

說明:這種叫做 『modal』 segue(模態轉換),新的場景完全蓋住了舊的那個。用戶無法再與上一個場景交互,除非先關閉這個場景,過一會我們會討論 『push』 segue,這種 segue 會把場景推入導航棧

6 - 聯線只能夠把你送到新的場景,你要是想回來,就得使用 delegate pattern(代理模式)。我們必須首先給這個新的場景設置一個獨有的類,新建一個繼承 UIViewController,命為 『PlayerDetailsViewController』

7 - 為了把它和 storyboard 相連,回到 MainStoryBoard,選擇新建的那個 Table View Contrller,將他的類設置為 PlayerDetailViewController,千萬不要忘記這一步,這很重要

8 - 做完這一步之後,把新場景的標題改為『Add Player』,分別加入『Done』和『Cancel』兩個導航欄按鈕,完成之後應該是這個樣子

技術分享

9 - 修改 PlayerDetailsViewController.h 如下

 1 #import <UIKit/UIKit.h>
 2 @class PlayerDetailsViewController;
 3 @protocol PlayerDetailsViewControllerDelegate <NSObject>
 4 - (void)playerDetailsViewControllerDidCancel:(PlayerDetailsViewController *)controller;
 5 - (void)playerDetailsViewControllerDidSave:(PlayerDetailsViewController *)controller;
 6 
 7 @end
 8 
 9 @interface PlayerDetailsViewController : UIViewController
10 
11 @property (nonatomic,weak) id <PlayerDetailsViewControllerDelegate> delegate;// 代理
12 
13 - (IBAction)cancel:(id)sender;// 取消按鈕
14 - (IBAction)done:(id)sender;// 確認按鈕
15 
16 @end

說明:這會聲明一個新的代理機制,當用戶點擊 Cancel 或者 done 按鈕時,我們將用它來交互 Add Player 場景和主場景通訊

10 - 回到故事版編輯器,將 Cancel 和 Done 按鈕分別與動作方法連接

技術分享

11 - 在 PlayerDetailsViewController.m,加入如下代碼

1 - (IBAction)cancel:(id)sender{
2     [self.delegate playerDetailsViewControllerDidCancel:self];
3 }
4 
5 - (IBAction)done:(id)sender {
6     [self.delegate playerDetailsViewControllerDidSave:self];
7 }

說明:① 這是兩個導航欄按鈕要使用的方法,現在只需要讓代理知道我們剛才加入了代碼,而真正關閉場景只是代理的事情

   ② 一般來說一定要為代理制定一個對象參數,這樣它才知道向那裏發送信息

12 - 現在我們已經為 PlayerDetailsViewController 設置了一個代理協議,我們需要將這個協議的實現方法(implement)寫在什麽地方,很明顯應該寫在 PlayerViewController ;因為這個 vc 代表了 Add Player 場景。在PlayersViewController.h 中加入如下代碼

1 #import <UIKit/UIKit.h>
2 #import "PlayerDetailsViewController.h"
3 @interface PlayersViewController : UITableViewController<PlayerDetailsViewControllerDelegate>// 接受代理
4 @property(nonatomic,strong)NSMutableArray *players;
5 
6 @end

13 - 在 PlayersViewController.m 的加入代碼

Xcode -(OC版)Storyboard教程 1.5:Segues的介紹