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,679评论 25 708
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,219评论 30 472
  • 开篇语 不得不说,这本书写的够絮叨,作者就是这个风格的。 另外,也不得不说,华章心理这个策划机构,策划的书也真的是...
    2018年注定不平凡阅读 1,272评论 1 3
  • 因为余秋雨的《抱槐山西》,对山西有了向往,想见证一下晋商的风采。在这之前并不知道山西有什么名胜古迹,自然也就不知道...
    何C呀阅读 475评论 0 0