代理的使用步驟
定義一份代理協議
協議名字的格式一般是:類名 + Delegate,比如UITableViewDelegate
設計代理的細節
?一般都是@optional(讓代理可以有選擇性去實現一些代理方法)
方法名一般都以類名開頭,比如- (void)scrollViewDidScroll:
一般都需要將對象本身傳出去,比如tableView的代理方法都會把tableView本身傳出去
必須要遵守NSObject協議(基協議)
比如@protocol XMGWineCellDelegate
聲明一個代理屬性
代理的類型格式:id<協議> delegate
@property (nonatomic, ?weak) id<XMGWineCellDelegate>?delegate;
設置代理對象
代理對象遵守協議,實現協議里面相應的方法
當控件內部發生了一些事情,就可以調用代理的代理方法通知代理
如果代理方法是@optional,那么需要判斷方法是否有實現,直接調用可能會報錯
if ( [self.delegate respondsToSelector:@selector(wineCellDidClickPlusButton: )] ) {? ?
[self.delegate wineCellDidClickPlusButton:self];
}
iOS監聽某些事件的方法
通知(NSNotificationCenter\NSNotification)
任何對象之間都可以傳遞消息.
使用范圍:
1個對象可以發通知給多個對象
1個對象可以接受多個對象發出的通知
要求:必須得保證通知的名字在發出和監聽時是一致的
KVO
僅僅是能監聽對象屬性的改變(靈活度不如通知和代理)
代理
使用范圍
1個對象只能設置一個代理(假設這個對象只有1個代理屬性)
1個對象能成為多個對象的代理
通知和代理的選擇
共同點
利用通知和代理都能完成對象之間的通信
(比如A對象告訴B對象發生了什么事情, A對象傳遞數據給B對象)
不同點
代理:1個對象只能告訴另1個對象發生了什么事情
通知:1個對象能告訴N個對象發生了什么事情
代理比通知規范
建議使用代理多于通知,能使用代理盡量使用代理