博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UISegmentedControl: 增加代理方法
阅读量:7282 次
发布时间:2019-06-30

本文共 2637 字,大约阅读时间需要 8 分钟。

UISegmentedControl 没有代理方法可以设置,不能在选择之前做预处理。为此,重写了 UISegmentedControl

 
创建文件 RFSegmentedControl,继承自 UISegmentedControl,并添加代理方法 RFSegmentedControlDelegate
两个代理方法,分别为 shouldSelected 和 didSelected,如名字,表示是否可以选择和已经选择的意思。
增加 delegate 的变量

#import 
@class RFSegmentedControl;@protocol RFSegmentedControlDelegate
- (BOOL)segmentedControl:(RFSegmentedControl *)segmentedControl shouldSelectAtIndex:(NSInteger)index;- (void)segmentedControl:(RFSegmentedControl *)segmentedControl didSelectedAtIndex:(NSInteger)index;- (void)segmentedControl:(RFSegmentedControl *)segmentedControl didSelectedAtIndex:(NSInteger)index userInteracted:(BOOL)userInteracted;@end@interface RFSegmentedControl : UISegmentedControl@property (assign, nonatomic) id
delegate;- (void)setSelectedSegmentIndex:(NSInteger)selectedSegmentIndex ignoreNotify:(BOOL)ignore;@end

 

增加私有变量 preIndex,表示选择之前的index
因为没有必要暴漏给其他类,定义在 .m 文件中即可,在 selectedIndex 变化之前,保存下来 selectedIndex 的值
NSInteger preIndex;
 
重写两个方法:willChangeValueForKey: didChangeValueForKey:
这两个方法会分别在 selectedIndex 变化前后触发,之前,保存原有的 selectedIndex 值,之后,根据 shouldSelect 代理方法判断是否可以点击,不可以点击则将原来的值重新赋值给 selectedIndex;可以点击则触发 didSelect 代理方法。

- (void)willChangeValueForKey:(NSString *)key{  if ([key isEqualToString:@"selectedSegmentIndex"]) {    preIndex = self.selectedSegmentIndex;  }}- (void)didChangeValueForKey:(NSString *)key{  if ([key isEqualToString:@"selectedSegmentIndex"]) {    BOOL shouldSelected = YES;    NSInteger index = [[self valueForKey:key] integerValue];    if ([self.delegate respondsToSelector:@selector(segmentedControl:shouldSelectAtIndex:)]) {      shouldSelected = [self.delegate segmentedControl:self shouldSelectAtIndex:index];    }    if (shouldSelected == NO) {      self.selectedSegmentIndex = preIndex;    }else{      if (_ignoreSelectedNotify == NO) {        if ([self.delegate respondsToSelector:@selector(segmentedControl:didSelectedAtIndex:)]) {          [self.delegate segmentedControl:self didSelectedAtIndex:index];        }        if ([self.delegate respondsToSelector:@selector(segmentedControl:didSelectedAtIndex:userInteracted:)]) {          [self.delegate segmentedControl:self didSelectedAtIndex:index userInteracted:_userInteracted];        }      }    }  }}- (void)setSelectedSegmentIndex:(NSInteger)selectedSegmentIndex ignoreNotify:(BOOL)ignore{  _ignoreSelectedNotify = ignore;   [self setSelectedSegmentIndex:selectedSegmentIndex];  _ignoreSelectedNotify = NO;}- (void)setSelectedSegmentIndex:(NSInteger)selectedSegmentIndex{  _userInteracted = NO;  [super setSelectedSegmentIndex:selectedSegmentIndex];  _userInteracted = YES;}

 

转载地址:http://blzjm.baihongyu.com/

你可能感兴趣的文章
C与C++,面向过程与面向对象
查看>>
第37件事 极简设计的3个方面
查看>>
Docker安装(yum方式 centos7)
查看>>
运算符
查看>>
一个简单的转换字母大小写的方法
查看>>
hibernate中evict()和clear()的区别
查看>>
学习web components
查看>>
PHP 将秒数转换成时分秒
查看>>
node.js 模块加载原理
查看>>
一个自定义线程池的小Demo
查看>>
Report_SRW工具的基本用法(概念)
查看>>
dedecms设置文章分页后,标题会带有序号的解决方法
查看>>
MySQL复制
查看>>
模式识别之相似度计量---余弦计算相似度度量关于两句话的相似度
查看>>
Django之ORM相关操作
查看>>
SVN 安装后报不是内部或外部命令
查看>>
win10 + cuda(v9.0) 安装TensorFlow-gpu版
查看>>
上课笔记
查看>>
工具类(为控件设置圆角) - iOS
查看>>
自定义android的tab样式
查看>>