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