iOS处理tableview的展开以及展开View上的响应事件(一)

在工作中经常会遇到展开式tableview的处理,如何快速的完成一个合适的可展开的tableView,以及对展开cell上的视图事件进行处理对新手开发者是一个比较伤脑筋的问题。结合最近手头的一个项目,我来总结一个简单的可展开的tableView的实现方式

首先,一个标记状态是必不可少的

@property(nonatomic,assign)BOOL isExpand;      //tableView是否打开标记

@property(nonatomic,assign)NSInteger SelectSection;    //选择的是哪一个section

//以tableView的section和row相结合,section为外层,row为展开层,简单方便

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{

return 4;

}

//在tableview的返回row的个数的代理方法中,处理isExpand的状态,在打开状态时返回需要的个数,你可以自定义一个数组来展示相应的数量

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

//在这里,我们让tableview在打开时展示2个row,关闭时返回0

if (self.isExpand == YES && section == self.SelectSection) {

return 2;

}

else

return 0;

}

return 0;

}

//当tableView展开时,使用我们的自定义cell来填充

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

if (self.isExpand == YES) {

    self.dayChosCell = [tableView cellForRowAtIndexPath:indexPath];

    self.dayChosCell.selectionStyle = UITableViewCellSelectionStyleNone;

    self.dayChosCell.bigDicCellUseDic = self.bigMsgDic;  //此处为自定义cell中所需要的数据,视个人情况传值

    self.dayChosCell.selectWeek = [NSString stringWithFormat:@"%ld",self.SelectSection];   //把目前所点击的section也传进去

    if (!self.dayChosCell)

        {

//我重写了cell的初始化方法,传进了我所需要的两个数据

        self.dayChosCell = [[ChooseDayTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"DAYS"AndSelectWeek:[NSString stringWithFormat:@"%ld",self.SelectSection] AndDic:self.bigMsgDic];

        self.dayChosCell.bigDicCellUseDic = self.bigMsgDic;

self.dayChosCell.frame = CGRectMake(0, 0, kWidth, [self tableView:self.PCDetailTableView heightForRowAtIndexPath:indexPath]);

self.dayChosCell.selectionStyle = UITableViewCellSelectionStyleNone;

//这里是方便cell内部视图点击事件的处理,使用了一个代理

self.dayChosCell.BtnSelectDelegate = self;

}

return self.dayChosCell;

}

else{

//当cell未展开时,返回nil

return nil;

}

return nil;

}

//不要忘了cell的返回高度

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

return 120;

}

//这里是建立section上的自定义View,由于我所需要的View比较简单,所以直接在这里创建了,也可以使用xib创建发咋的自定义view

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{

UIView *viewForHeader = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 60)];

UIButton *weekBtn = [UIButton buttonWithType:UIButtonTypeCustom];

weekBtn.frame = viewForHeader.frame;

weekBtn.tag = 556+section;    //这里是随便加了一个数字,防止其他地方发生tag值相同的尴尬情况

[weekBtn addTarget:self action:@selector(WeekSelectAction:) forControlEvents:UIControlEventTouchDown];

//这里是UIButton的一个类目,方便了初始化btn之后复杂的设定,

[weekBtn setTitle:[NSString stringWithFormat:@"%@",self.weekArray[section]] andTitleState:UIControlStateNormal andFont:[UIFont fontWithName:@"Helvetica-Bold" size:14] andTitleColor:[UIColor colorWithHex:0x222222] andColorState:UIControlStateNormal andBgColor:[UIColor whiteColor] andRadius:0];

[viewForHeader addSubview:weekBtn];

return viewForHeader;

}

//设置section的高度

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{

return 60;

}

//为了美观,将footer设置为0,当然,需要footer时也可以设置

-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{

return 0;

}

//由于我并不需要左滑编辑,所以我把编辑代理关掉了

-(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{

return NO;

}


//这是section上的btn的点击事件,由此控制isExpand的状态

-(void)WeekSelectAction:(UIButton *)sender{

if (self.isExpand == NO) {

self.isExpand = YES;

sender.selected = YES;

self.SelectSection = sender.tag - 556;

//只需要重载tableview,不需要insert或者delete,绕过了新手头疼的数组越界问题

[self.whichWeekView.weekTableView reloadData];

}

else

{

self.isExpand = NO;

sender.selected = NO;

self.SelectSection = sender.tag;

[self.whichWeekView.weekTableView reloadData];

}

}


这样就可以简单的完成一个可以展开收起的tableview了,对于展开cell上的事件处理,我们下一篇见。


你可能感兴趣的:(iOS处理tableview的展开以及展开View上的响应事件(一))