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;
@end

@interface RFSegmentedControl : UISegmentedControl

@property (assign, nonatomic) id<RFSegmentedControlDelegate> delegate;
@end

 

增加私有变量 preIndex,表示选择之前的index

因为没有必要暴漏给其他类,定义在 .m 文件中即可,在 selectedIndex 变化之前,保存下来 selectedIndex 的值

NSInteger preIndex;

 

重写两个方法:willChangeValueForKey: didChangeValueForKey:

这两个方法会分别在 selectedIndex 变化前后触发,之前,保存原有的 selectedIndex 值,之后,根据 shouldSelect 代理方法判断是否可以点击,不可以点击则将原来的值重新赋值给 selectedIndex;可以点击则触发 didSelect 代理方法。

- (void)willChangeValueForKey:(NSString *)key
{
    if ([key isEqualToString:@"selectedSegmentIndex"]) {
        //保存之前的 selectedIndex
        preIndex = self.selectedSegmentIndex;
    }
}

- (void)didChangeValueForKey:(NSString *)key
{
    if ([key isEqualToString:@"selectedSegmentIndex"]) {
        BOOL shouldSelected = YES;

        NSInteger index = [[self valueForKey:key] integerValue];

        //通过代理方法获取是否可以选择的 boolean 值
        if ([self.delegate respondsToSelector:@selector(segmentedControl:shouldSelectAtIndex:)]) {
            shouldSelected = [self.delegate segmentedControl:self shouldSelectAtIndex:index];
        }

        if (shouldSelected == NO) {
            //如果不能选择,则设置 selectedSegmentedIndex 为 preIndex
            self.selectedSegmentIndex = preIndex;
        }else{
            //如果能够选择,触发已选择的代理方法
            if ([self.delegate respondsToSelector:@selector(segmentedControl:didSelectedAtIndex:)]) {
                [self.delegate segmentedControl:self didSelectedAtIndex:index];
            }
        }
    }
}

UISegmentedControl: 增加代理方法

时间: 2024-10-12 08:27:34

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

ScrollView各属性,及代理方法汇总

本文希望对那些UI初级学者,提供些帮助. 笔者感言:学习scrollView,可能再以后的工作中用的不是太多,但它的两个子类,相信用的比例绝对很大,UITableVIew和UICollectionView.大家都知道,OC是一门面向对象,基于C语言封装而出的一门高级语言.面向对象的三大特性:封装.继承.多态.说到继承,子类不仅仅能继承父类的属性和方法,其代理也能继承,所以ScrollView的代理方法,及各属性的设置,在UITableView及UICollectionView中也可以使用,看博客

【iOS开发-110】MapKit框架的主要类MKMapView以及代理方法,大头针的使用addAnnotation

#import "ViewController.h" #import <MapKit/MapKit.h> #import <CoreLocation/CoreLocation.h> @interface ViewController ()<MKMapViewDelegate> @property(nonatomic,strong) CLLocationManager *locMgr; @property (weak, nonatomic) IBOut

Android模拟器设置网络代理方法

在服务器上启动模拟器的时候加了--http-proxy,但是不起作用.所以搜了下面的方法 四种方法: 一:将网络连接代理设置写入配置数据库 (适合启动模拟器无界面) 1.通过命令行或者通过双击emulatoer可执行文件,打开模拟器 2.在命令行执行adb shell 打开android的控制台 (确保环境变量设置正确,即已经把Android_SDK/tools 添加到了PATH(Linux)/path(Windows)) 3.执行 ls -l /data/data/com.android.pr

mybatis系列笔记(2)---mapper代理方法

mapper代理方法 在我们在写MVC设计的时候,都会写dao层和daoimp实现层,但假如我们使用mapper代理的方法,我们就可以不用先daoimp实现类 当然这得需要遵守一些相应的规则: (1)Usermapper.java接口必须和Usermapper.xml名称相同,且要在同一目录下: (2)mapper.xml中namespace等于mapper接口的地址 (3)Usermapper.java接口中国的方法名和Usermapper.xml中statement的id一致 <!-- 7综

mybatis学习笔记,mapper代理方法的使用

一.开发人员需要完成的任务: mapper.xml映射文件和mapper.java 二.开发规范 1.在mapper.xml中namespace等于mapper接口地址. 2.mapper.java接口中的方法名和mapper.xml中statement的id一致 3.mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致. 4.mapper.java接口中的方法返回值类型和mapper.xml中statement的re

设置警告框样式为带有两个文本输入的警告框,用于收集用户收货地址和联系电话。并选择合适的代理方法,当警告框上的两输入框有一个为空时限制“购买”按钮点击。

收集购物信息  iOS项目 倒计时:588 步骤 /.panel-heading 项目需求 设置警告框样式为带有两个文本输入的警告框,用于收集用户收货地址和联系电话.并选择合适的代理方法,当警告框上的两输入框有一个为空时限制“购买”按钮点击. #import "TableViewController.h" @interface TableViewController ()<UIAlertViewDelegate> @property (nonatomic, strong)

代理方法的使用条件和XIb具体实现步骤

使?用xib封装?一个view的步骤 1. 新建?一个?文件描述?一个的内部结构假设叫做 新建?一个?自定义的类 ?自定义类需要继承?自系统?自带的继承?自哪个类取决于根对象的 3. 新建类的类名最好跟的?文件名保持?一致?比如类名就叫做 将中的控件 和 ?自定义类的?文件 进?行连线 5. 提供?一个类?方法返回?一个创建好的?自定义屏蔽从加载的过程 提供?一个模型属性让外界传递模型数据 7. 重写模型属性的setter?方法,在这?里将模型数据展?示到对应的?子控件上?面 Delegate的

子类继承父类实现父类的代理方法

父类提供虚函数(OC中称为代理方法),子类继承后实现虚函数来实现特定的功能. 父类方法: NumberCount.h 与 NumberCount.m // // NumberCount.h // YXMWeather // // Created by XianMingYou on 15/2/18. // Copyright (c) 2015年 XianMingYou. All rights reserved. // #import <Foundation/Foundation.h> @clas

增加swap方法

java环境内存不够用 swap在工作中,特别是java环境,程序写的有问题,会发生内存泄漏,可能会占用swap. 协调让开发改程序,运维可以临时增大swap.增加swap方法 创建一个块文件 dd  if=/dev/zero of=/tmp/100m  bs=1M   count=100 [[email protected] ~]# dd  if=/dev/zero of=/tmp/100m  bs=1M count=100 100+0 records in 100+0 records out