在iOS開發(fā)中嘹锁,我們會在實際過程中大量使用Block右蒲,其中Block有個很基礎(chǔ)的功能阀湿,就是完成兩個頁面間的傳值。而今天瑰妄,我就用實際的項目中的頁面陷嘴,來展示如何完成兩個頁面間的傳值。
首先我們先來看间坐,這個界面中灾挨,我們需要傳遞什么值。我們需要在點擊選擇房間之后竹宋,跳轉(zhuǎn)到房間列表界面劳澄,在UITableViewController
中,選擇房間名蜈七,之后按下確定
按鈕后秒拔,跳轉(zhuǎn)回第一個界面,使我們選擇的房間名飒硅,顯示在房間
選項處砂缩。
房間列表界面
因為事件其實是發(fā)生在第二個界面,按下確定
按鈕時三娩,所以我們在第二個界面庵芭,聲明并定義Block。
typedef void(^SelectedRoomBlock)(NSString *roomName);
@interface SelectRoomTypeVC : UIViewController
@property (nonatomic, copy) SelectedRoomBlock selectedRoomBlock;
- (void)returnRoomName:(SelectedRoomBlock)block;
我們先用
typedef
聲明一個叫SelectedRoomBlock
的Block
雀监,它需要有一個類型為NSString
的參數(shù)双吆。之后我們聲明一個類型為
SelectedRoomBlock
的變量selectedRoomBlok
。我們定義一個函數(shù)会前,需要傳入一個
Block
類型的參數(shù)好乐,這個方法不用也可以,目的是為了減少代碼量回官,使我們使用Block的過程更加清晰曹宴。
接下來我們就要開始來使用Block傳值了,我們先來實現(xiàn)剛剛定義的函數(shù)方法歉提。
- (void)returnRoomName:(SelectedRoomBlock)block{
self.selectedRoomBlock = block;
}
很清晰的實現(xiàn)笛坦,就是為了再后來調(diào)用時区转,出現(xiàn)一個Block代碼塊,更加清晰版扩。
把傳進來的Block語句塊保存到本類的實例變量selectedRoomBlock(.h中定義的屬性)中废离,然后尋找一個時機調(diào)用,而這個時機就是上面說到的礁芦,當(dāng)確認按鈕按下時蜻韭。
之后聲明一個字符串類型的變量,保存我們剛剛存儲的房間的值柿扣。
@property (nonatomic, copy) NSString *selectedRoomStr;
而獲取值在UITableView
的代理方法中實現(xiàn)肖方,這里就不贅述了。
因為我們按下確定按鈕開始傳值未状,所以我們在ButtonAction
中來實現(xiàn)俯画。
- (void)ButtonAction:(UIBarButtonItem *)sender{
switch (sender.tag) {
case 107:{
if (self.selectedRoomBlock != nil) {
self.selectedRoomBlock(self.selectedRoom);
}
[self.navigationController popViewControllerAnimated:YES];
break;
}
default:
break;
}
}
第一個視圖界面
我們回到第一個視圖界面,在Push
出第二個界面時生成第二個界面的地方司草,調(diào)用我們的Block屬性艰垂。
[self.navigationController pushViewController:_selectRoomVC animated:YES];
[_selectRoomVC returnRoomName:^(NSString *roomName) {
_addDeviceCellInfo.roomName = roomName;
}];
這里我們就可以用任意的變量,來匹配Block傳遞進來的roomName參數(shù)埋虹。
至此猜憎,就已經(jīng)完成了Block在兩個頁面間的傳值,效果如上圖,是不是其實也特別簡單呢搔课。