Delegate簡單使用

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>
  • 聲明一個代理屬性
    • 代理的類型格式: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個對象能成為多個對象的代理
    • 通知規范
    • 建議使用代理多于通知
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 掌握 UIScrollView的常見屬性 UIScrollView的常用代理方法 UIScrollView的縮放 ...
    JonesCxy閱讀 2,770評論 1 12
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,573評論 25 708
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,217評論 30 472
  • 開篇語 不得不說,這本書寫的夠絮叨,作者就是這個風格的。 另外,也不得不說,華章心理這個策劃機構,策劃的書也真的是...
    2018年注定不平凡閱讀 1,270評論 1 3
  • 因為余秋雨的《抱槐山西》,對山西有了向往,想見證一下晉商的風采。在這之前并不知道山西有什么名勝古跡,自然也就不知道...
    何C呀閱讀 475評論 0 0