tableView的Header刷新问题

遇到的问题

  • 一般刷新tableView的时候,执行
    [self.tableView reloadData]
    会刷新table表单里面的所有数据
  • 但是在项目中,难免遇到一种需求:如下图

    在图片中,上面是headerView,下面是cell,在点击按钮的时候,改变下面数据源,但是上面的按钮有选中状态,默认是选中一个按钮的,假如默认选中第一个按钮,在点击第二个按钮的时候刷新tableView,第一个按钮也会变成选中状态。
  • 出现这种情况的原因可能是:

1.在设置按钮单选的时候,tag值搞错了。

2.在设置tableView的headerView的时候,是用代理方法设置的,执行[self.tableView reloadData]的时候,又走了一遍代理方法,给headerView中的按钮重新赋值了。如下:

1
2
3
4
5
6
7
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
SQSignInHeaderView *view = [tableView dequeueReusableHeaderFooterViewWithIdentifier:NSStringFromClass(SQSignInHeaderView.class)];
view.delegate = self;
[view setDetailModel:_signInDetail];
[view setCurrentMonthDays:_percentViewWidth];
return view;
}

解决办法

  • 1.修改按钮的tag值。
1
2
3
4
5
6
7
8
9
10
- (void)buttonClicked:(UIButton *)sender{
for (int i = 0, i < 3, i++){
if (sender.tag == i){
sender.selected = YES;
continu;
}
UIButton *btn = (UIButton *)[self.view viewForTag:i];
btn.selected = NO;
}
}
  • 2.不使用UITabelViewHeaderFooterView给tableView设置头部视图,使用UIView,然后再控制器中懒加载headerView
  • SQSignInModel.h

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #import <UIKit/UIKit.h>
    #import "SQSignInModel.h"

    @protocol SignInHeaderViewDelegate<NSObject>
    - (void)actionOnSignInButton:(UIButton *)button;
    - (void)actionOnGiftButton:(UIButton *)button;
    @end
    //创建一个继承自UIView的headerView
    @interface SQSignInHeaderView : UIView
    proModel(SQDetailSignInModel, detailModel);
    proInteger(currentMonthDays);
    @property (nonatomic, assign) id<SignInHeaderViewDelegate> delegate;
    proModel(SQSignInReachModel, reachModel);
    + (instancetype)headerView;
    @end
  • 在控制器中

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    //懒加载headerView
    - (SQSignInHeaderView *)signInHeaderView {
    if (!_signInHeaderView) {
    self.signInHeaderView = ({
    SQSignInHeaderView *view = [SQSignInHeaderView headerView];
    view.delegate = self;
    view;
    });
    }
    return _signInHeaderView;
    }
    //懒加载tableView
    - (UITableView *)signInTabelView {
    if (!_signInTabelView) {
    self.signInTabelView = ({
    UITableView *tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_SIZE.width, SCREEN_SIZE.height-MC_NavHeight-MC_TabbarSafeBottomMargin) style:UITableViewStyleGrouped];
    tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    tableView.backgroundColor = [UIColor whiteColor];
    tableView.rowHeight = 92*DHFlexibleHorizontalMutiplier();
    tableView.delegate = self;
    tableView.dataSource = self;
    tableView.tableHeaderView = self.signInHeaderView;
    tableView;
    });
    }
    return _signInTabelView;
    }
  • 在加载tableView的时候,通过以下方法给tableView设置头部视图:
    tableView.tableHeaderView = self.signInHeaderView;

  • 在执行[self.tableView reloadData]的时候,就不会在创建一次headerView了。