关于数据源跟事件封装实例

#import <UIKit/UIKit.h>

@class XWDropdownMenu;
#pragma mark 数据源方法
@protocol XWDropdownMenuDataSource <NSObject>
@required
/**
 *  主表格一共有多少行
 */
- (NSInteger)numberOfRowsInMainTable:(XWDropdownMenu *)dropdownMenu;
/**
 *  主表格每一行的标题
 *  @param row          行号
 */
- (NSString *)dropdownMenu:(XWDropdownMenu *)dropdownMenu titleForRowInMainTable:(NSInteger)row;
/**
 *  主表格每一行的子数据 数组
 *  @param row          行号
 */
- (NSArray *)dropdownMenu:(XWDropdownMenu *)dropdownMenu subdataForRowInMainTable:(NSInteger)row;
@optional
/**
 *  主表格每一行 分类数量
 *  @param row          行号
 */
- (NSString *)dropdownMenu:(XWDropdownMenu *)dropdownMenu countForRowInMainTable:(NSInteger)row;
/**
 *  子表格每一行子数据 分类数量
 *  @param row          行号
 */
- (NSArray *)dropdownMenu:(XWDropdownMenu *)dropdownMenu subdataCountForRowInSubTable:(NSInteger)row;
/**
 *  主表格每一行的图标
 *  @param row          行号
 */
- (NSString *)dropdownMenu:(XWDropdownMenu *)dropdownMenu iconForRowInMainTable:(NSInteger)row;
/**
 *  子表格每一行的选中图标
 *  @param row          行号
 */
- (NSString *)dropdownMenu:(XWDropdownMenu *)dropdownMenu selectedIconForRowInMainTable:(NSInteger)row;
@end

#pragma mark 代理方法
@protocol XWDropdownMenuDelegate <NSObject>

@optional
- (void)dropdownMenu:(XWDropdownMenu *)dropdownMenu didSelectRowInMainTable:(NSInteger)row;
- (void)dropdownMenu:(XWDropdownMenu *)dropdownMenu didSelectRowInSubTable:(NSInteger)subrow inMainTable:(NSInteger)mainRow;

@end

#pragma mark 构造方法
@interface XWDropdownMenu : UIView
+ (instancetype)dropdownMenu;
-(void)refreshMenu;

@property (nonatomic, weak) id<XWDropdownMenuDataSource> dataSource;
@property (nonatomic, weak) id<XWDropdownMenuDelegate> delegate;

/**主表被选中的字体颜色,默认是黑色*/
@property (strong, nonatomic) UIColor *selectedRowTextColor;
/**该属性设置成YES,主表比较小*/
@property (nonatomic, assign)BOOL isMainTableSmall;
@end
#import "XWDropdownMenu.h"
#import "XWDropdownMenuMainCell.h"
#import "XWDropdownMenuSubCell.h"
#import "XWBadgeView.h"

#define XWColor(r, g, b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0]
#define XWUserDefaults [NSUserDefaults standardUserDefaults]
#define kXWLastSelectedMainRow @"XWLastSelectedMainRow"

/** 值越大,主表越小 */
#define kXWTableScale 0.15

@interface XWDropdownMenu()
@property (weak, nonatomic) IBOutlet UITableView *mainTableView;
@property (weak, nonatomic) IBOutlet UITableView *subTableView;
/** 左边主表选中的行号 */
@property (nonatomic, assign) NSInteger selectedMainRow;
/** 表格比例 */
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *tableScale;
@end

@implementation XWDropdownMenu

+ (instancetype)dropdownMenu
{
    return [[[NSBundle mainBundle] loadNibNamed:@"XWDropdownMenu" owner:nil options:nil] firstObject];
}

- (void)awakeFromNib
{
    self.subTableView.backgroundColor = XWColor(245, 245, 245);
    self.selectedMainRow = [[XWUserDefaults objectForKey:kXWLastSelectedMainRow] integerValue];
    self.selectedRowTextColor  = [UIColor blackColor];
}

#pragma mark - 数据源方法
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (tableView == self.mainTableView) {
        if ([self.dataSource respondsToSelector:@selector(numberOfRowsInMainTable:)]) {
            return [self.dataSource numberOfRowsInMainTable:self];
        }
    } else {
        if ([self.dataSource respondsToSelector:@selector(dropdownMenu:subdataForRowInMainTable:)]) {
            return [self.dataSource dropdownMenu:self subdataForRowInMainTable:self.selectedMainRow].count;
        }
    }
    return 0;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = nil;
    //主表
    if (tableView == self.mainTableView) {
        cell = [XWDropdownMenuMainCell cellWithTableView:tableView];

        // 取出数据
        if ([self.dataSource respondsToSelector:@selector(dropdownMenu:titleForRowInMainTable:)]) {
            cell.textLabel.text = [self.dataSource dropdownMenu:self titleForRowInMainTable:indexPath.row];
            cell.textLabel.font = [UIFont systemFontOfSize:14];

            if (self.selectedMainRow == indexPath.row) {
                [tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionNone];
                cell.textLabel.textColor = self.selectedRowTextColor;
            }else{
                cell.textLabel.textColor = [UIColor blackColor];
            }
        }

        if ([self.dataSource respondsToSelector:@selector(dropdownMenu:iconForRowInMainTable:)]) {
            cell.imageView.image = [UIImage imageNamed:[self.dataSource dropdownMenu:self iconForRowInMainTable:indexPath.row]];
        }

        if ([self.dataSource respondsToSelector:@selector(dropdownMenu:selectedIconForRowInMainTable:)]) {
            cell.imageView.highlightedImage = [UIImage imageNamed:[self.dataSource dropdownMenu:self selectedIconForRowInMainTable:indexPath.row]];
        }

        if ([self.dataSource respondsToSelector:@selector(dropdownMenu:countForRowInMainTable:)]) {
            XWBadgeView *badgeView = [[XWBadgeView alloc] initWithFrame:CGRectMake(0, 0, 0, 13)];
            badgeView.backgroundColor  = XWColor(205, 205, 205);
            badgeView.textColor = [UIColor whiteColor];
            badgeView.font = [UIFont systemFontOfSize:12];
            badgeView.badgeValue = [self.dataSource dropdownMenu:self countForRowInMainTable:indexPath.row];
            cell.accessoryView = badgeView;
        }
    } else {
        // 从表
        cell = [XWDropdownMenuSubCell cellWithTableView:tableView];
        cell.textLabel.font = [UIFont systemFontOfSize:14];
        if ([self.dataSource respondsToSelector:@selector(dropdownMenu:subdataForRowInMainTable:)]) {
            NSArray *subdata = [self.dataSource dropdownMenu:self subdataForRowInMainTable:self.selectedMainRow];
            cell.textLabel.text = subdata[indexPath.row];
        }

        if ([self.dataSource respondsToSelector:@selector(dropdownMenu:subdataCountForRowInSubTable:)]) {
            XWBadgeView *badgeView = [[XWBadgeView alloc] initWithFrame:CGRectMake(0, 0, 0, 13)];
            badgeView.backgroundColor  = XWColor(205, 205, 205);
            badgeView.textColor =  [UIColor whiteColor];
            NSArray *subCount = [self.dataSource dropdownMenu:self subdataCountForRowInSubTable:self.selectedMainRow];
            badgeView.font = [UIFont systemFontOfSize:12];
            badgeView.badgeValue = subCount[indexPath.row];
            cell.accessoryView = badgeView;
        }
    }

    return cell;
}

#pragma mark - 代理方法
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (tableView == self.mainTableView) {
        //在这里记录一下上一次选中主表的哪一行
        [XWUserDefaults setObject:[NSString stringWithFormat:@"%ld",indexPath.row] forKey:kXWLastSelectedMainRow];

        self.selectedMainRow = indexPath.row;
        [self.mainTableView reloadData];
        [self.subTableView reloadData];

        // 通知代理
        if ([self.delegate respondsToSelector:@selector(dropdownMenu:didSelectRowInMainTable:)]) {
            [self.delegate dropdownMenu:self didSelectRowInMainTable:indexPath.row];
        }
    } else {
        // 通知代理
        if ([self.delegate respondsToSelector:@selector(dropdownMenu:didSelectRowInSubTable:inMainTable:)]) {
            [self.delegate dropdownMenu:self didSelectRowInSubTable:indexPath.row inMainTable:self.selectedMainRow];
        }
    }
}

#pragma mark 刷新整个视图 当一个控制器中有多个XWDropdownMenu
-(void)refreshMenu
{
    [self.mainTableView reloadData];
    [self.subTableView reloadData];
}

-(void)setIsMainTableSmall:(BOOL)isMainTableSmall
{
    _isMainTableSmall = isMainTableSmall;
    self.tableScale.constant = !isMainTableSmall ? : self.frame.size.width * kXWTableScale;
}
@end

运用:

#import "XWDropdownMenu.h"

#define XWScreenSize [UIScreen mainScreen].bounds.size

@interface ViewController ()<XWDropdownMenuDataSource,XWDropdownMenuDelegate>
@property (nonatomic, strong)NSMutableArray *mainArray;
@property (nonatomic, strong)NSMutableArray *subArray;
@property (weak, nonatomic) XWDropdownMenu *dropdownMenu;
- (IBAction)showBtnClick:(UIButton *)sender;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self testMenu];
}

//主表数据
-(NSMutableArray *)mainArray
{
    if (!_mainArray) {
        self.mainArray = [NSMutableArray array];
        self.mainArray = [NSMutableArray arrayWithObjects:@"左边测试数据1",@"左边测试数据2",@"左边测试数据3",@"左边测试数据4",@"左边测试数据5",@"左边测试数据6",@"左边测试数据7",nil];
    }
    return _mainArray;
}

//从表数据
-(NSMutableArray *)subArray
{
    if (!_subArray) {
        self.subArray = [NSMutableArray array];
        self.subArray = [NSMutableArray arrayWithObjects:@[@"右测1",@"右侧2"],@[@"右测3",@"右侧4"],@[@"右测5",@"右侧6",@"右侧7"],@[@"右测4"],@[@"右测5"],@[@"右测6"],@[@"右测7"],nil];
    }
    return _subArray;
}

- (IBAction)showBtnClick:(UIButton *)sender {
    self.dropdownMenu.hidden = sender.selected;

    sender.selected = !sender.selected;
}

-(void)testMenu
{
    XWDropdownMenu *menu = [XWDropdownMenu dropdownMenu];
    self.dropdownMenu = menu;
//    menu.backgroundColor = [UIColor redColor];
    menu.hidden = YES;
    menu.frame = CGRectMake(0, 120,XWScreenSize.width, 250);
    menu.dataSource = self;
    menu.delegate = self;
    menu.selectedRowTextColor = [UIColor redColor];
    [self.view addSubview:menu];
}

//主表行数
-(NSInteger)numberOfRowsInMainTable:(XWDropdownMenu *)dropdownMenu
{
    return self.mainArray.count;
}

//主表标题
-(NSString *)dropdownMenu:(XWDropdownMenu *)dropdownMenu titleForRowInMainTable:(NSInteger)row
{
    return self.mainArray[row];
}

//子表的数据返回的是一个数组,主表每行都对应一个从表数据数组
-(NSArray *)dropdownMenu:(XWDropdownMenu *)dropdownMenu subdataForRowInMainTable:(NSInteger)row
{
    return self.subArray[row];
}

//主表行未选中图标
-(NSString *)dropdownMenu:(XWDropdownMenu *)dropdownMenu iconForRowInMainTable:(NSInteger)row
{
    return @"collect_icon";
}

//主表行选中图标
-(NSString *)dropdownMenu:(XWDropdownMenu *)dropdownMenu selectedIconForRowInMainTable:(NSInteger)row
{
    return @"collect_icon_selected";
}

//主表行的圆点提示个数
-(NSString *)dropdownMenu:(XWDropdownMenu *)dropdownMenu countForRowInMainTable:(NSInteger)row
{
    return @"10";
}

//从表行的圆点提示个数
-(NSArray *)dropdownMenu:(XWDropdownMenu *)dropdownMenu subdataCountForRowInSubTable:(NSInteger)row
{
    return [NSArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5",@"6",@"7",nil];
}

//主表选中行
-(void)dropdownMenu:(XWDropdownMenu *)dropdownMenu didSelectRowInMainTable:(NSInteger)row
{
    NSLog(@"%@",self.mainArray[row]);
}

//从表选中行
-(void)dropdownMenu:(XWDropdownMenu *)dropdownMenu didSelectRowInSubTable:(NSInteger)subrow inMainTable:(NSInteger)mainRow
{
//    self.dropdownMenu.hidden = YES;
    NSLog(@"%@",self.subArray[mainRow][subrow]);
}

@end

本实例的封装表格是左右两个列表,由于是用故事板的页面操作,所以若用纯代码可以对它进行修改,把创建表格的代码重新写入;

时间: 2024-10-09 21:07:44

关于数据源跟事件封装实例的相关文章

事件封装(多个函数绑定一个事件,估计这样解释不对)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/> <!-

PHP实现事件机制实例分析

PHP实现事件机制实例分析 内置了事件机制的语言不多,php也没有提供这样的功能.事件(Event)说简单了就是一个Observer模式,实现起来很容易.但是有所不同的是,事件的监听者谁都可以加,但是只能由直接包含它的对象触发.这就有一点点难度了.php有一个debug_backtrace函数,可以得到当前的调用栈,由此可以找到判断调用事件触发函数的对象是不是直接包含它的对象的办法. <?php /** * 事件 * @edit http://www.lai18.com * @author xi

简单的JS运动封装实例---侧栏分享到

1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 5 <title>无标题文档</title> 6 <style> 7 #div1 {width: 100px; height: 200px; background: red;

js移动端tap事件封装

这几天做项目,发现移动端需要触摸事件,而click肯定是不行的,于是我对tap事件封装进行了搜索,找到了一篇文章,原文地址如下:http://www.jb51.net/article/50663.htm, 我对其中第一个封装加了一点东西,把它封装在一个函数里面,使用的时候直接调用即可,源代码如下(tap.js): function tap(ele, fn){ var startTx, startTy; var endTx, endTy; ele.addEventListener( 'touchs

事件封装(多个函数绑定一个事件,预计这样解释不正确)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/> <!-

javascript移动设备Web开发中对touch事件的封装实例

在触屏设备上,一些比较基础的手势都需要通过对 touch 事件进行二次封装才能实现.zepto 是移动端上使用率比较高的一个类库,但是其 touch 模块模拟出来的一些事件存在一些兼容性问题,如 tap 事件在某些安卓设备上存在事件穿透的 bug,其他类型的事件也或多或少的存在一些兼容性问题. 于是乎,干脆自己动手对这些常用的手势事件进行了封装,由于没有太多真实的设备来进行测试,可能存在一些兼容性问题,下面的代码也只是在 iOS 7.Andorid 4 上的一些比较常见的浏览器中测试通过. ta

iOS_25_彩票设置的cell的数据源模型的封装

组模型的封装 SettingGroup // // SettingGroup.h // 25_彩票 // // Created by beyond on 14-8-28. // Copyright (c) 2014年 com.beyond. All rights reserved. // 模型,一组(Section,Group),包括 组的header,组的footer,中间的条目(cell数组) #import <Foundation/Foundation.h> @interface Set

iScroll 5 刷新封装实例应用

一.准备环节 iscroll.js 5.x版本项目地址 https://github.com/cubiq/iscroll 演示地址:http://pnc.co.il/dev/iscroll-5-pull-to-refresh-and-infinite-demo.html 下载解压,我们打开demos目录,把click复制,改名字为app,也就是我们处理的基础,app文件目录下的index.html改为app.html,都是为了更好理解为自己创建的应用 我们打开app.html,先预览一下js文件

通过html5 touch事件封装手势识别组件

html5移动端新增了touchstart,touchmove,touchend事件,利用这3个事件,判断手指的点击和划动轨迹,我们可以封装各种手势的识别功能, 这3个事件和pc端的mousedown,mousemove,mouveup非常类似,不同的是touch事件可以有多个点击的点,而鼠标每次只有一个点,我们即然是做组件封装,就要考虑在pc上调试的情况,否则用手机调试非常不方便,通过对mouse事件的处理,可以一套代码同时兼容pc端和移动端. 下面来逐步封装一个滑动手势(swipe)的组件