[self.p_tableArrenumerateObjectsUsingBlock:^(id obj,NSUInteger idx, BOOL *stop) {
<#code#>
}]
另外一個常見的地方就是頁面跳轉present以后的完成回調,
[self presentViewController:<(UIViewController *)> animated:<(BOOL)> completion:<^(void)completion>]
3.塊語法在UIAlertView中的集中代碼
UIAlertView是1個彈窗控件,有1些按鈕,最多見的就是確認和取消,UIAlertView有1個代理處理這些按鈕,當用戶點擊后,該代理可以捕獲按鈕的下標,然后用戶根據下標Index寫1些邏輯代碼。
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
快語法的第1個妙用就是可以直接在創建這個UIAlertView控件的時候就已寫好邏輯代碼,完全不用寫在以上回調中。
以下是具體實現。
第1步,申明1個全部的Block對象,根據UIAlertView的回調代理可知,該代理主要參數是1個NSInteger類型的參數,那末我們申明的Block對象可以根據代理的實際情況來創建。
@property(nonatomic,copy)void(^p_alertBlock)(NSInteger);
第2部,在創建這個UIAltView的地方實現這個全部的Block對象。
if(!self.p_alertBlock)
{
self.p_alertBlock = ^(NSInteger buttonIndex)
{
AccountViewController *acc = accc;
switch (buttonIndex) {
case 0:
break;
case 1:
if([acc.p_fmdbdeleteObjc:list])
{
[acc.p_tableArrremoveObjectAtIndex:acc.p_didSelect];
[acc.p_tablereloadData];
}
break;
}
};
}
UIAlertView *alt = [[UIAlertViewalloc] initWithTitle:NSLocalizedString(@"tip",nil)message:NSLocalizedString(@"sureDelet",nil) delegate:selfcancelButtonTitle:NSLocalizedString(@"cancel",nil) otherButtonTitles:NSLocalizedString(@"ok",nil),nil];
[altshow];
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
self.p_alertBlock(buttonIndex);
}
這個用法有1個好處就是可以在UIAlertView還未創建之前就已肯定了它按鈕的處理,集中代碼,看起來更加的方便和直觀。
以上只是1個事例,在系統很多控件中都可以這樣實現,諸如UIActionSheet等。
3.塊語法替換Delegate
提起ios的消息通知,就少不了代理Delegate。代理雖然很方便,可是實現的進程比較繁瑣。如果使用塊語法的話,我們可以提早把回調函數的代碼實現封裝到Block中作為參數傳遞給數據層,這模樣實際上在代理回調中
if(self.delegate && [self.delegaterespondsToSelector:@selector(setAddressSuccess:)])
{
[self.delegatesetAddressSuccess:self.accountList.remark];
}
這句話就被Block(self.accountList.remark);所取代。
是否是更加的便捷了呢?關鍵是你根本就不用聲明朝理,實現,設置代理,保護協議等等復雜的進程。
代理還有1個限制就是必須要對象化,假設1個工具類是1個類的實例方法,你想在某些操作以后把數據回調給C層,這個時候代理就沒法實行了,但是Block只不是是1個對象而已,就像NSString1樣,可以幫助你實現。
以上只是塊語法在系統控件API回調中的妙用和兩個類之間代理的妙用,更多的功能還有待在實際開發中逐漸發掘發現。
仁者見仁,智者見智,塊語法究竟強大到何種地步,等你用多了就知道了。