delegate 簡(jiǎn)單介紹
監(jiān)聽(tīng)scrollView各種行為的3大步驟(比如讓控制器監(jiān)聽(tīng)scrollView的行為)
- 設(shè)置scrollView的delegate(代理)為控制器對(duì)象
scrollView.delegate = 控制器;
- 控制器要遵守UIScrollViewDelegate協(xié)議
@interface 控制器 () <UIScrollViewDelegate>
@end
- 控制器要實(shí)現(xiàn)UIScrollViewDelegate協(xié)議里面的代理方法
#pragma mark - <UIScrollViewDelegate> 代理方法
/**
* 只要scrollView在滾動(dòng)稿存,就會(huì)調(diào)用這個(gè)方法(監(jiān)聽(tīng)scrollView的滾動(dòng))
*/
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
NSLog(@"scrollViewDidScroll");
}
代理使用的一般規(guī)律
- 作用:用來(lái)監(jiān)聽(tīng)控件的某些行為
- 代理:是控制器對(duì)象
- 代理:是id類(lèi)型笨篷,并且是弱指針
- 代理協(xié)議的格式:控件類(lèi)名Delegate,比如UIScrollViewDelegate瓣履、UITextFieldDelegate
- 代理方法:方法名一般是控件名開(kāi)頭率翅,比如UIScrollView的代理方法一般以scrollView開(kāi)頭
如何監(jiān)聽(tīng)控件的行為
- 通過(guò)addTarget:
- 只有繼承自UIControl的控件,才有這個(gè)功能
- UIControlEventTouchUpInside : 點(diǎn)擊事件(UIButton)
- UIControlEventValueChanged : 值改變事件(UISwitch袖迎、UISegmentControl冕臭、UISlider)
- UIControlEventEditingChanged : 文字改變事件(UITextField)
- 通過(guò)delegate
- 只有擁有delegate屬性的控件,才有這個(gè)功能
NSTimer的使用
- 開(kāi)啟定時(shí)器
@property (nonatomic, weak) NSTimer *timer;
// 返回一個(gè)自動(dòng)開(kāi)始執(zhí)行任務(wù)的定時(shí)器
self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(nextPage:) userInfo:@"123" repeats:YES];
// 修改NSTimer在NSRunLoop中的模式:NSRunLoopCommonModes
// 主線程不管在處理什么操作燕锥,都會(huì)抽時(shí)間處理NSTimer
[[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
- 關(guān)閉定時(shí)器
[self.timer invalidate];
代理的使用步驟
代理的使用步驟
- 定義一份代理協(xié)議
- 協(xié)議名字的格式一般是:類(lèi)名 + Delegate
- 比如UITableViewDelegate
- 代理方法細(xì)節(jié)
- 一般都是@optional
- 方法名一般都以類(lèi)名開(kāi)頭
- 比如
- (void)scrollViewDidScroll:
- 比如
- 一般都需要將對(duì)象本身傳出去
- 比如tableView的方法都會(huì)把tableView本身傳出去
- 必須要遵守NSObject協(xié)議
- 比如
@protocol XMGWineCellDelegate <NSObject>
- 比如
- 協(xié)議名字的格式一般是:類(lèi)名 + Delegate
- 聲明一個(gè)代理屬性
- 代理的類(lèi)型格式:id<協(xié)議> delegate
@property (nonatomic, weak) id<XMGWineCellDelegate> delegate;
- 設(shè)置代理對(duì)象
xxx.delegate = yyy;
代理對(duì)象遵守協(xié)議辜贵,實(shí)現(xiàn)協(xié)議里面相應(yīng)的方法
-
當(dāng)控件內(nèi)部發(fā)生了一些事情,就可以調(diào)用代理的代理方法通知代理
- 如果代理方法是@optional归形,那么需要判斷方法是否有實(shí)現(xiàn)
if ([self.delegate respondsToSelector:@selector(wineCellDidClickPlusButton:)]) {
[self.delegate wineCellDidClickPlusButton:self];
}
iOS監(jiān)聽(tīng)某些事件的方法
- 通知(NSNotificationCenter\NSNotification)
- 任何對(duì)象之間都可以傳遞消息
- 使用范圍
- 1個(gè)對(duì)象可以發(fā)通知給N個(gè)對(duì)象
- 1個(gè)對(duì)象可以接受N個(gè)對(duì)象發(fā)出的通知
- 必須得保證通知的名字在發(fā)出和監(jiān)聽(tīng)時(shí)是一致的
- KVO
- 僅僅是能監(jiān)聽(tīng)對(duì)象屬性的改變(靈活度不如通知和代理)
- 代理
- 使用范圍
- 1個(gè)對(duì)象只能設(shè)置一個(gè)代理(假設(shè)這個(gè)對(duì)象只有1個(gè)代理屬性)
- 1個(gè)對(duì)象能成為多個(gè)對(duì)象的代理
- 比
通知
規(guī)范 - 建議使用
代理
多于通知
- 使用范圍