第三方库RATreeView的使用记录

版权声明:本文为博主原创文章。未经博主同意不得转载。

https://blog.csdn.net/u012951123/article/details/36421939

由于项目须要用到树状列表,能够添加成员变量,于是用了第三方RATreeView开元库,头一次使用,安装github上的使用说明和Demo跑了一下,挺惬意,添加成员什么的都非常easy,和tableview非常像是,可是在处理选择的cell时我纠结了一会,用惯了tableview的index:index.row   index.section等。猛然接触到RATreeView处理时,不知道该怎样办了,以下记录的我学习过程,

以下先看下。RATreeView是怎样管理选择这个动作的,方法例如以下:

<span style="font-size:18px;">//Managing Selections
- (id)treeView:(RATreeView *)treeView willSelectRowForItem:(id)item treeNodeInfo:(RATreeNodeInfo *)treeNodeInfo;
- (void)treeView:(RATreeView *)treeView didSelectRowForItem:(id)item treeNodeInfo:(RATreeNodeInfo *)treeNodeInfo;
- (id)treeView:(RATreeView *)treeView willDeselectRowForItem:(id)item treeNodeInfo:(RATreeNodeInfo *)treeNodeInfo;
- (void)treeView:(RATreeView *)treeView didDeselectRowForItem:(id)item treeNodeInfo:(RATreeNodeInfo *)treeNodeInfo;</span>

事实上我们实用的信息都存储在treeNodeInfo中。以下我们来分析一下 RATreeNodeInfo

@property (nonatomic, getter = isExpanded, readonly) BOOL expanded;  //推断是否展开
@property (nonatomic, readonly) NSInteger treeDepthLevel;   //树状展开的深度。也就是层次级别


@property (nonatomic, readonly) NSInteger siblingsNumber; 
@property (nonatomic, readonly) NSInteger positionInSiblings;    //在每一个层次中。我们选择的单元处于的位置,也就是索引

@property (strong, nonatomic, readonly) RATreeNodeInfo *parent;   //我们选择的cell的上一级信息汇总
@property (strong, nonatomic, readonly) NSArray *children;   //我们选择的cell 的子类包括的成员数组

@property (strong, nonatomic, readonly) id item;  
 
实用的信息我都已经标出来了。

可能到如今你还混乱则呢。什么是树状结构,什么是层次?以下我们来张图分析一下:


以下通过我项目中的代码片端来分析一下datasource 和delegate 方法的使用方法:

#pragma mark TreeView Delegate methods
- (CGFloat)treeView:(RATreeView *)treeView heightForRowForItem:(id)item treeNodeInfo:(RATreeNodeInfo *)treeNodeInfo
{
    return 60;//这里范围单元个的高度。能够单独处理每一个单元格,通过以下就知道怎样单独处理我们想要的了
}

- (NSInteger)treeView:(RATreeView *)treeView indentationLevelForRowForItem:(id)item treeNodeInfo:(RATreeNodeInfo *)treeNodeInfo
{
    return 3 * treeNodeInfo.treeDepthLevel;   //这个我还没理解。应该是返回我们要使用的文件夹深度。几层吧,我项目中就用到两层,所以没改动
}

//这个函数决定 能否够展开。通过设定我们能够设置哪些单元格能够展开到下一层,哪些不能够展开
- (BOOL)treeView:(RATreeView *)treeView shouldExpandItem:(id)item treeNodeInfo:(RATreeNodeInfo *)treeNodeInfo
{
    RADataObject *objc = (RADataObject *)item;
    if ([objc.name isEqualToString:@"宝贝成员"]) {   //事实上,这里的item就是我们点击的单元cell。当中RADataObject不知道的话。建议去下载一下treeView的源代码看看就会明确了
        return YES;                                //事实上我们还能够通过treeNodeInfo来做,由于它包括了我们所须要的全部信息
    }
    return NO;
}

//这个函数:但我们数据又一次载入时,我们来决定,展开哪个单元。在项目中我的成员列表刷新后,要又一次载入数据,同一时候要展开我的成员列表
 - (BOOL)treeView:(RATreeView *)treeView shouldItemBeExpandedAfterDataReload:(id)item treeDepthLevel:(NSInteger)treeDepthLevel
{
    RADataObject *objec = (RADataObject *)item;
    if ([objec.name isEqualToString:@"宝贝成员"]) {
        return YES;
    }
    return NO;
}

//这个看字面意识就理解了,在单元格显示之前(或者说将要显示时)我们能够做些设置,这里是设置对应深度的颜色背景
- (void)treeView:(RATreeView *)treeView willDisplayCell:(UITableViewCell *)cell forItem:(id)item treeNodeInfo:(RATreeNodeInfo *)treeNodeInfo
{
    if (treeNodeInfo.treeDepthLevel == 0) {
        cell.backgroundColor = UIColorFromRGB(0xF7F7F7);
    } else if (treeNodeInfo.treeDepthLevel == 1) {
        cell.backgroundColor = UIColorFromRGB(0xD1EEFC);
    } else if (treeNodeInfo.treeDepthLevel == 2) {
        cell.backgroundColor = UIColorFromRGB(0xE0F8D8);
    }
}

//这里就是我们最熟悉的点击cell处理函数,看代码慢慢体会treeNodeInfo的使用。不想多说了
-(void)treeView:(RATreeView *)treeView didSelectRowForItem:(id)item treeNodeInfo:(RATreeNodeInfo *)treeNodeInfo
{
    NSInteger count = treeNodeInfo.parent.children.count;//你点击的该单元的父节点有多少个成员
    NSInteger treeDpthLevelValue = treeNodeInfo.treeDepthLevel;
    NSInteger positionInSiblingsValue = treeNodeInfo.positionInSiblings;
    if (treeDpthLevelValue == 0)
    {
        if (positionInSiblingsValue == 0 ) {
            //回到首页
            [self.mm_drawerController closeDrawerAnimated:YES completion:nil];
        }else if(positionInSiblingsValue == 1){
            //不处理
        }else if(positionInSiblingsValue == 2){
            //进入发烧预警

        }else if(positionInSiblingsValue == 3){
            //推荐给朋友
        }else if(positionInSiblingsValue == 4){
            //设置
            SettingViewController *setting = [[SettingViewController alloc]initWithNibName:@"SettingViewController" bundle:nil];
            [self presentViewController:setting animated:YES completion:nil];
        }
    }else if (treeDpthLevelValue == 1)
    {
            if (count == 1)
            {
                //进入添加成员设置页面
                AddMemberViewController *addVC = [[AddMemberViewController alloc]initWithNibName:@"AddMemberViewController" bundle:nil];
                [self presentViewController:addVC animated:YES completion:nil];
                
            }else
            {
                if (positionInSiblingsValue == count - 1) {
                    //进入添加成员设置页面
                    NSLog(@"进入添加成员页面");
                    //AddMemberViewController *addVC = [[AddMemberViewController alloc]initWithNibName:@"AddMemberViewController" bundle:nil];
                    [self presentViewController:addVC animated:YES completion:nil];
                    
                }else
                {
                    //设置用户选择的成员标志
                    self.selectedMemberIndex = positionInSiblingsValue;
                    NSLog(@"用户选择的第 %li 个成员",self.selectedMemberIndex);
                }
            }
    }
}
#pragma mark TreeView Data Source
//数据源处理,相当于UITableViewCell处理,关键还是理解treeNodeInfo概念
- (UITableViewCell *)treeView:(RATreeView *)treeView cellForItem:(id)item treeNodeInfo:(RATreeNodeInfo *)treeNodeInfo
{
    NSInteger numberOfChildren = [treeNodeInfo.children count];
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cell"];

   // cell.detailTextLabel.text = [NSString stringWithFormat:@"Number of children %d", numberOfChildren];
    cell.textLabel.text = ((RADataObject *)item).name;
   // cell.selectionStyle = UITableViewCellSelectionStyleNone;
    if (treeNodeInfo.treeDepthLevel == 0) {
        cell.detailTextLabel.textColor = [UIColor blackColor];
    }
    return cell;
}
//返回每一层包括成员的个数,来制表
- (NSInteger)treeView:(RATreeView *)treeView numberOfChildrenOfItem:(id)item
{
    if (item == nil) {
        return [self.data count];
    }
    RADataObject *data = item;
    return [data.children count];
}
//返回对象
- (id)treeView:(RATreeView *)treeView child:(NSInteger)index ofItem:(id)item
{
    RADataObject *data = item;
    if (item == nil) {
        return [self.data objectAtIndex:index];
    }
    return [data.children objectAtIndex:index];
}


//这里是我想简单、单独说的他们都是delegate方法,可是是用来管理单元cell编辑的,比方删除等
//看各个函数的名字都知道什么意识了,过程能够这么理解:将要開始、运行、运行后
#pragma mark -
#pragma mark TreeView Editing
//这里决定单元格是否可编辑
-(BOOL)treeView:(RATreeView *)treeView canEditRowForItem:(id)item treeNodeInfo:(RATreeNodeInfo *)treeNodeInfo
{
    return YES;
}
-(void)treeView:(RATreeView *)treeView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowForItem:(id)item treeNodeInfo:(RATreeNodeInfo *)treeNodeInfo
{

    NSLog(@"self.objcArray == %@",self.objcArray);
    if (treeNodeInfo.treeDepthLevel == 1) {
         NSInteger index = treeNodeInfo.positionInSiblings;
        [self.objcArray removeObjectAtIndex:index];
        _willDeleteMember = [self.members objectAtIndex:index];//将要在数据库中删除的成员对象
    }
    _membersObject = [RADataObject dataObjectWithName:@"宝贝成员" children:[self.objcArray copy]];
    [self.data replaceObjectAtIndex:1 withObject:_membersObject];
    
   
    [self.treeView reloadData];
    
}
-(void)treeView:(RATreeView *)treeView willBeginEditingRowForItem:(id)item treeNodeInfo:(RATreeNodeInfo *)treeNodeInfo
{
    NSLog(@"willBeginEditinRow");
    
}
-(void)treeView:(RATreeView *)treeView didEndEditingRowForItem:(id)item treeNodeInfo:(RATreeNodeInfo *)treeNodeInfo
{
    //展开成员列表
    //[self.treeView expandRowForItem:treeNodeInfo.parent withRowAnimation:RATreeViewRowAnimationMiddle]; //expands Row
    //[self.treeView expandRowForItem:item];
    NSLog(@"DidEnditing.....");
    
    
    //完毕编辑后。同步数据库:数据库也要删除对应的成员
    NSString *path = [self getDBPath];
    FMDatabase *membersDB = [FMDatabase databaseWithPath:path];
    if (![membersDB open]) {
        NSLog(@"Failed to open membersDB");
        [membersDB close];
    }
    
    BOOL rs = [membersDB executeUpdate:@"DELETE FROM Member WHERE Name = ?

",_willDeleteMember.name]; if (!rs) { return; } NSLog(@"success delete"); [membersDB close]; }


项目中占时用到这么多,以后会慢慢完好的

转载于:https://www.cnblogs.com/mqxnongmin/p/10578111.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值