UISegmentedControl: 增加代理方法
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: 增加代理方法的更多相关文章
- 【iOS开发-30】UITabBarController的几种代理方法以及结合NSUserDefaults还原上次退出时被选中视图控制器和视图控制器的顺序
一.UITabBarController的几种代理方法 在AppDelegate.h中加入一个协议<UITabBarControllerDelegate>.然后再AppDelegate.m ...
- 04_Spring AOP两种代理方法
什么是AOP? AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是O ...
- 通读AFN②--AFN的上传和下载功能分析、SessionTask及相应的session代理方法的使用细节
这一部分主要研究AFN的上传和下载功能,中间涉及到各种NSURLSessionTask的一些创建的解析和HTTPSessionManager对RESTful风格的web应用的支持,同时会穿插一点NSU ...
- UITextField的代理方法:textField:shouldChangeCharactersInRange:replacementString
原文链接:http://www.cnblogs.com/zhanggui/p/6101813.html 这个我在开发的过程中用到的次数最多,因此这里就简单对其进行分析.先看看Command+点击 弹出 ...
- iOS开发之巧用Block和代理方法结合来传值
好久没写技术博客了,因为996的工作周期已经持续好几个月了.每天晚上回家都没有太多精力学习很多其他的东西,而且很多时候是接着完善工作的项目的模块开发.所以博客停歇了这么久,更新率也低了不少,今天补充一 ...
- UITableView的常用属性和代理方法
以下是近期总结的关于tableView的一些属性和代理方法,以及一些常见的问题,现汇总如下,今后还会持续更新,请继续关注: tableView 的头部和尾部视图属性: UISwitch *foot ...
- IOS中在自定义控件(非视图控制器)的视图跳转中 代理方法与代码块的比较
//代码块与代替代理的设计方法 我就以在自定义视图中(非视图控制器,不能实现视图控制功能),通过代理和代码块两种方法分别实现视图的跳转,进行对比 首先自定义了一个视图,上面有一个已经注册了得BUtto ...
- iOS开发——网络篇——NSURLSession,下载、上传代理方法,利用NSURLSession断点下载,AFN基本使用,网络检测,NSURLConnection补充
一.NSURLConnection补充 前面提到的NSURLConnection有些知识点需要补充 NSURLConnectionDataDelegate的代理方法有一下几个 - (void)conn ...
- UITableView表格视图、UITableView代理方法及应用
一.基本知识点 UITableView表格视图,是一个可以滚动的界面(理解为垂直滚动的UIScrollView),可展示多行数据,没有行数的限制,只能有一列. 使用UITableView: 1.展示信 ...
随机推荐
- 在pycharm中启动Django服务器
1.要是直接运行manage.py程序的话 会提示一大堆东西,那无非是提示没有传入参数.先打开mange.py,然后再运行,会提示一堆东西,表示没有配置参数.在pycharm右上角点击edit con ...
- 从 shell 眼中看世界
(字符) 展开每一次你输入一个命令,然后按下 enter 键,在 bash 执行你的命令之前, bash 会对输入的字符完成几个步骤处理.我们已经知道两三个案例,怎样一个简单的字符序列,例如 “*”, ...
- TCP、UDP数据包大小的限制
版权声明:本文为灿哥哥http://blog.csdn.net/caoshangpa 原创文章,转载请标明出处. https://blog.csdn.net/caoshangpa/article/de ...
- php 裁剪图片类
<?php /* *说明:函数功能是把一个图像裁剪为任意大小的图像,图像不变形 * 参数说明:输入 需要处理图片的 文件名,生成新图片的保存文件名,生成新图片的宽,生成新图片的高 * writt ...
- resource.h
resource.h就是.rc文件的头文件.rc文件里的常量全在resource.h定义 .rc文件和resource.h 都是给project add resource 的时候VS 自动生成的.一般 ...
- Android 日历控件PickTime
最近做项目,需要设置用户的生日,所以做这样一个功能. 开始发觉自带的 DatePicker 很是不好用. 上代码: <DatePicker android:id="@+id/dpPic ...
- vagrant中css,img不生效的问题
用vagrant搭建了一个共享开发平台,修改css文件后,页面看不到效果,通过查看源文件地址,发现新修改的Css文件并没有加载进来,加载的还是旧的文件地址.一开始以为是浏览器有缓存,清空了各种浏览器缓 ...
- android中画图类的介绍Path
Paint类相关属性: /** * Paint类介绍 * * Paint即画笔,在绘图过程中起到了极其重要的作用,画笔主要保存了颜色, * 样式等绘制信息,指定了如何绘制文本和图形,画笔对象有很多设置 ...
- MyEclipse10中配置开发Python所需要的PyDev 绝对靠谱 不忽悠!
在NLP(自然语言处理)这个领域中,Python具有良好的声誉,于是也想学习一下.首先第一步就是需要在计算机上配置Python环境.由于Python自带的编辑器太简单,使用起来不顺手,于是就考虑在相对 ...
- docker原理
Docker原理11 Linux Namespace 11 AUFS文件系统17 重新理解Docker的各种命令18 Docker原理 Linux Namespace docker是一个容器引擎,容器 ...