UISegmentedControl 没有代理方法可以设置,不能在选择之前做预处理。为此,重写了 UISegmentedControl
 
创建文件 RFSegmentedControl,继承自 UISegmentedControl,并添加代理方法 RFSegmentedControlDelegate
两个代理方法,分别为 shouldSelected 和 didSelected,如名字,表示是否可以选择和已经选择的意思。
增加 delegate 的变量

#import <UIKit/UIKit.h>

@class RFSegmentedControl;
@protocol RFSegmentedControlDelegate <NSObject> - (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<RFSegmentedControlDelegate> 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;
}

UISegmentedControl: 增加代理方法的更多相关文章

  1. 【iOS开发-30】UITabBarController的几种代理方法以及结合NSUserDefaults还原上次退出时被选中视图控制器和视图控制器的顺序

    一.UITabBarController的几种代理方法 在AppDelegate.h中加入一个协议<UITabBarControllerDelegate>.然后再AppDelegate.m ...

  2. 04_Spring AOP两种代理方法

    什么是AOP?           AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是O ...

  3. 通读AFN②--AFN的上传和下载功能分析、SessionTask及相应的session代理方法的使用细节

    这一部分主要研究AFN的上传和下载功能,中间涉及到各种NSURLSessionTask的一些创建的解析和HTTPSessionManager对RESTful风格的web应用的支持,同时会穿插一点NSU ...

  4. UITextField的代理方法:textField:shouldChangeCharactersInRange:replacementString

    原文链接:http://www.cnblogs.com/zhanggui/p/6101813.html 这个我在开发的过程中用到的次数最多,因此这里就简单对其进行分析.先看看Command+点击 弹出 ...

  5. iOS开发之巧用Block和代理方法结合来传值

    好久没写技术博客了,因为996的工作周期已经持续好几个月了.每天晚上回家都没有太多精力学习很多其他的东西,而且很多时候是接着完善工作的项目的模块开发.所以博客停歇了这么久,更新率也低了不少,今天补充一 ...

  6. UITableView的常用属性和代理方法

    以下是近期总结的关于tableView的一些属性和代理方法,以及一些常见的问题,现汇总如下,今后还会持续更新,请继续关注:   tableView 的头部和尾部视图属性: UISwitch *foot ...

  7. IOS中在自定义控件(非视图控制器)的视图跳转中 代理方法与代码块的比较

    //代码块与代替代理的设计方法 我就以在自定义视图中(非视图控制器,不能实现视图控制功能),通过代理和代码块两种方法分别实现视图的跳转,进行对比 首先自定义了一个视图,上面有一个已经注册了得BUtto ...

  8. iOS开发——网络篇——NSURLSession,下载、上传代理方法,利用NSURLSession断点下载,AFN基本使用,网络检测,NSURLConnection补充

    一.NSURLConnection补充 前面提到的NSURLConnection有些知识点需要补充 NSURLConnectionDataDelegate的代理方法有一下几个 - (void)conn ...

  9. UITableView表格视图、UITableView代理方法及应用

    一.基本知识点 UITableView表格视图,是一个可以滚动的界面(理解为垂直滚动的UIScrollView),可展示多行数据,没有行数的限制,只能有一列. 使用UITableView: 1.展示信 ...

随机推荐

  1. goto语句的升级版,setjmp,longjmp

    我们知道goto语句是不能跳过函数的,但是在我么C语言的应用中,在不使用汇编的情况下,遇到需要跳出深层循环比如检错机制的时候,有确实想要跨函数跳转,有没有上面办法可以做到呢? 这就是今天要讲的两个库函 ...

  2. 【微信小程序】tabBar的显示问题

    tabBar不显示 在app.json中配置了4个页面,在tabBar的list中随意写了两个页面,编译后发现不能显示tabBar. { "pages": [ "page ...

  3. [Issue]git做rebase时,弹出编辑器为nano,不会使用

    今天在做一个branch的rebase, 执行git rebase -i master的时候,自动弹出了nano 编译器,捣鼓了很久,还是不会编译,保存退出,执行Ctrl+X就自动结束了,查了下,需要 ...

  4. hbase源码系列(十二)Get、Scan在服务端是如何处理?

    继上一篇讲了Put和Delete之后,这一篇我们讲Get和Scan, 因为我发现这两个操作几乎是一样的过程,就像之前的Put和Delete一样,上一篇我本来只打算写Put的,结果发现Delete也可以 ...

  5. 虚拟机创建及安装ELK

    虚拟机创建及安装ELK 作者:高波 归档:学习笔记 2018年5月31日 13:57:02 快捷键: Ctrl + 1    标题1 Ctrl + 2    标题2 Ctrl + 3    标题3 C ...

  6. 升级 Elasticsearch 集群数量实战记录

    搜索引擎 升级 Elasticsearch 集群数量实战记录 现在线上有一个elasticsearch集群搜索服务有三台elasticsearch实例(es1.es2.es3),打算将其升级为5台(增 ...

  7. 前端CSS - 相对定位,绝对定位,固定定位

    前端CSS - 相对定位,绝对定位,固定定位 1.1 相对定位 position:relative 相对定位,就是微调元素位置的.让元素相对自己原来的位置,进行位置的微调. 也就是说,如果一个盒子想进 ...

  8. 【html5】html5 本地存储

    最近一直在学习 html5,为了后期的移动项目进行知识储备.html5 相对于 html4 新增加了一些有趣的标签.属性和方法,今天主要介绍下 html5 的本地存储. 在客户端存储数据 html5 ...

  9. Android-FragmentPagerAdapter刷新无效的解决方案

    按照通常使用ListView的习惯做法,如果你只是更新保存Fragment的List数据,然后调用adapter的notifyDataSetChanged()是不会起作用的. 搜索了下发现此问题普遍存 ...

  10. python——读取MATLAB数据文件 *.mat

    鉴于以后的目标主要是利用现有的Matlab数据(.mat或者.txt),主要考虑python导入Matlab数据的问题.以下代码可以解决python读取.mat文件的问题.主要使用sicpy.io即可 ...