Segue
- segue 就是這個玩意,兩個視圖控制器之間的連接器羽利,UIStoryboardSegue 的對象.
segue
- segue屬性
每一個 Segue 對象,都有3個屬性
// 唯一標識
@property (nonatomic, readonly) NSString *identifier;
// 來源控制器
@property (nonatomic, readonly) id sourceViewController;
// 目標控制器
@property (nonatomic, readonly) id destinationViewController;
前一個界面往后一個界面?zhèn)髦?/h2>
#1-> 了解一下下面這個函數(shù)
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
#2-> 演示步驟
- 新建兩個類繼承 UIViewController娃闲,假設(shè)第一個界面關(guān)聯(lián)的類是 FirVC皇帮,第二個界面關(guān)聯(lián)的類是 SecVC.
- 在 storyboard 里,分別在第一属拾、二個界面里拉一個 TextField 控件,并在各自的類中引出輸出口梯浪,這是為了演示第一個界面的值傳到第二個界面了.
@property (weak, nonatomic) IBOutlet UITextField *firstVCTF;
@property (weak, nonatomic) IBOutlet UITextField *secondVCTF;
- 在第一個界面加一個 button,右鍵拖到第二個界面礼预,讓第一個界面調(diào)到 第二個界面.
- SecVC.h 中聲明一個屬性保存第一個界面?zhèn)鱽淼闹?
@property (nonatomic) NSString *str;
- 關(guān)鍵一步虏劲,在 FirVC.m 文件中重寫下面這個函數(shù)褒颈,函數(shù)中励堡,聲明一個 SecVC 對象 vc 指向第一個界面的下一個界面,將第一個界面對應(yīng)的值傳給第二個界面.
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
SecVC *vc = segue.destinationViewController;
vc.str = self.firstVCTF.text;
[super prepareForSegue:segue sender:sender];
}
- 然后在 SecVC.m 文件中的 viewDidLoad 函數(shù)中刨疼,把 str 中保存的第一個界面的值賦值給 secondVCTF 讓第二個界面加載后把數(shù)據(jù)顯示出來.
self.secondVCTF.text = self.str;
#3-> 演示結(jié)果
第一個界面
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
@property (weak, nonatomic) IBOutlet UITextField *firstVCTF;
@property (weak, nonatomic) IBOutlet UITextField *secondVCTF;
@property (nonatomic) NSString *str;
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
SecVC *vc = segue.destinationViewController;
vc.str = self.firstVCTF.text;
[super prepareForSegue:segue sender:sender];
}
self.secondVCTF.text = self.str;
第一個界面
點擊按鈕跳轉(zhuǎn)到第二個界面
第二個界面
后一個界面往前一個界面?zhèn)髦?/h2>
- 逆向傳值一般都是使用代理實現(xiàn)的揩慕,由于有了 segue 使得正向傳值挺方便的扮休,我就在考慮能不能使得逆向傳值也能用 segue 來實現(xiàn),功夫不負有心人呀蜗搔,終于還是弄出來了八堡,還是比較有點小技巧的!
- 之前提到 segue 是 UIStoryboardSegue 的對象不同,并且有3個屬性,這里就用到了
- 主題思想就是把 sugue 也順帶傳給第二個界面二拐,在第二個界面里就能通過傳過來的 segue 獲得sourceViewController凳兵,即第一個界面視圖控制器,然后就可以將第二個界面的數(shù)據(jù)傳送給第一個界面了
#1-> 在第二個界面類文件添加屬性 retSegue 接受傳過來的 segue
@property (nonatomic) UIStoryboardSegue *retSegue;
#2-> 在第一個界面類文件中修改之前的 prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 函數(shù)
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
SecVC *vc = segue.destinationViewController;
vc.str = self.firTF.text;
vc.retSegue = segue;//第二個界面拿到segue
[super prepareForSegue:segue sender:sender];
}
#3-> 在第二個界面類文件 viewDidDisappear 函數(shù)里把第二個界面的數(shù)據(jù)傳給第一個界面饭望,當然你也可以在其他合適的地方傳送數(shù)據(jù)
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:YES];
FirVC *vc = self.retSegue.sourceViewController; //拿到第一個界面視圖控制器
vc.firstVCTF.text = self.secondVCTF.text; //傳送數(shù)據(jù)到第一個界面
}
逆向傳值就在正向傳值的基礎(chǔ)上把segue傳過來以讓第二個界面可以獲得第一個界面視圖控制器铅辞,我這么做是行的通的,編譯器可以正常運行斟珊,結(jié)果也正確
#4-> 演示結(jié)果
第二個界面
- 逆向傳值一般都是使用代理實現(xiàn)的揩慕,由于有了 segue 使得正向傳值挺方便的扮休,我就在考慮能不能使得逆向傳值也能用 segue 來實現(xiàn),功夫不負有心人呀蜗搔,終于還是弄出來了八堡,還是比較有點小技巧的!
@property (nonatomic) UIStoryboardSegue *retSegue;
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
SecVC *vc = segue.destinationViewController;
vc.str = self.firTF.text;
vc.retSegue = segue;//第二個界面拿到segue
[super prepareForSegue:segue sender:sender];
}
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:YES];
FirVC *vc = self.retSegue.sourceViewController; //拿到第一個界面視圖控制器
vc.firstVCTF.text = self.secondVCTF.text; //傳送數(shù)據(jù)到第一個界面
}
逆向傳值就在正向傳值的基礎(chǔ)上把segue傳過來以讓第二個界面可以獲得第一個界面視圖控制器铅辞,我這么做是行的通的,編譯器可以正常運行斟珊,結(jié)果也正確
第二個界面
點擊左上角的箭頭返回第一個界面囤踩,可以看到旨椒,第一個界面的 textfield 內(nèi)容跟著改變了
第一個界面