前言:
當(dāng)我們需要多個View Controller來完成多個界面時饼齿,經(jīng)常會需要互相傳遞數(shù)據(jù)屡萤,這時我們就會用到segue。當(dāng)然delegate也可以勝任這個任務(wù)贫堰,但是相比delegate穆壕,segue的使用就簡單很多了。
第四周一個簡單的小作業(yè):
制作四步注冊界面:
- 用戶名/密碼
- email / 全名
- 界面上要提示用戶名
- 可返回上一步其屏,應(yīng)能顯示之前填寫的資料
- 如果返回過上一步喇勋,再進(jìn)來,之前填寫過的資料要有
- 確認(rèn)填寫的信息是否正確偎行,
- 顯示所有填寫過的信息川背,密碼用 * 代替
- 可返回上一步,應(yīng)能顯示之前填寫的資料
- 創(chuàng)建成功提示
- 要提到用戶名
- 放一個注冊下一個用戶蛤袒,要能直接跳到第1步
- 如果想加一個主動結(jié)束應(yīng)用的按鈕熄云,可調(diào)用 exit(0);
我們就以第1、2步為例來說明ViewController之間利用segue進(jìn)行數(shù)據(jù)傳遞的使用方法妙真。
兩個ViewController分別為FirstViewController和SecondViewController(以下簡稱First缴允、Second)
一、UIStoryboardSegue的定義
@interface UIStoryboardSegue : NSObject
- (id)initWithIdentifier:(NSString *)identifier
source:(UIViewController *)source
destination:(UIViewController *)destination;
@property (nonatomic, readonly) NSString *identifier;
@property (nonatomic, readonly) id sourceViewController;
@property (nonatomic, readonly) id destinationViewController;
@end
-
identifier
用來找到segue的標(biāo)識
-
source & destination
為了區(qū)分視圖的跳轉(zhuǎn)珍德,可以用上一個练般、下一個來表示,也可以用源視圖锈候、目標(biāo)視圖來表示薄料。 即:sourceViewController 和destinationViewController。 目標(biāo)視圖控制器是指:即將顯示(加載)的視圖晴及, 而源視圖控制器是指:即將被取代的視圖控制器都办。
二、點(diǎn)擊First的下一步虑稼,將First中的用戶名傳給Second
- 先在storyboard中將“下一步”與Second連接起來琳钉,并將這一步的segue的identifier屬性設(shè)成to2。
- 這里我們需要用到
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
這個方法蛛倦,使用segue參數(shù)的destinationViewController屬性就可以找到下一個ViewController了歌懒。 - 僅僅找到是不夠的,我們還需要為下一個ViewController賦值溯壶,使用
[viewController setValue: forKey: ]
來存儲數(shù)據(jù)及皂。
First類中:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
UIViewController* destinationController = [segue destinationViewController];
if ([segue.identifier isEqualToString:@"to2"]) {
[destinationController setValue:self.nameField.text forKey:@"name"];
}
}
Second類.h中:
@interface SecondViewController : UIViewController
@property (strong, nonatomic) NSString* name;
@end
這樣我們就可以在Second中直接使用name屬性來訪問數(shù)據(jù)了甫男。
三、點(diǎn)擊Second上一步验烧,將Second數(shù)據(jù)傳給First
為了實(shí)現(xiàn)這個要求
如果返回過上一步板驳,再進(jìn)來,之前填寫過的資料要有
我們就需要將這些信息傳給First碍拆,以便在First下一步的時候可以重新將這些數(shù)據(jù)傳進(jìn)來若治。
這里不能再用一個segue再指回去,這樣會使得界面每次都重新加載會出現(xiàn)各種問題感混,所以我們利用Second的exit返回上一步端幼,使用unwind segue。同樣弧满,這里我們先把unwind segue的identifier屬性設(shè)成from2To1婆跑。
First類.h中:
@interface ViewController : UIViewController
@property (strong, nonatomic) NSString* fullname;
@property (strong, nonatomic) NSString* email;
@end
First類.m中:
- (IBAction)unwindToFirst:(UIStoryboardSegue *)unwindSegue towardsViewController:(UIViewController *)subsequentVC {
// if ([unwindSegue.identifier isEqualToString:@"from2To1"]) {
// NSLog(@"fullname: %@", _fullname);
// }
}
Second類中和之前一樣的傳值方式:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"from2To1"]) {
UIViewController* destinationController = [segue destinationViewController];
[destinationController setValue:self.fullnameField.text forKey:@"fullname"];
[destinationController setValue:self.emailField.text forKey:@"email"];
}
}
四、其他
-
prepareForSegue: sender:
的觸發(fā)條件:
當(dāng)前的視圖控制器即將被另一個視圖控制器所替代時庭呜,segue將處于激活狀態(tài)滑进,從而調(diào)用prepareForSegue:sender: 方法。