首页 > 其他 > 详细

UISegmentedControl: 增加代理方法

时间:2014-07-29 16:56:22      阅读:282      评论:0      收藏:0      [点我收藏+]

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: 增加代理方法,布布扣,bubuko.com

UISegmentedControl: 增加代理方法

原文:http://www.cnblogs.com/ihojin/p/segmentedcontrol-delegate-shouleselect.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!