遇到的问题
- 一般刷新tableView的时候,执行
[self.tableView reloadData]
会刷新table表单里面的所有数据
- 但是在项目中,难免遇到一种需求:如下图
在图片中,上面是headerView,下面是cell,在点击按钮的时候,改变下面数据源,但是上面的按钮有选中状态,默认是选中一个按钮的,假如默认选中第一个按钮,在点击第二个按钮的时候刷新tableView,第一个按钮也会变成选中状态。
- 出现这种情况的原因可能是:
1.在设置按钮单选的时候,tag值搞错了。
2.在设置tableView的headerView的时候,是用代理方法设置的,执行[self.tableView reloadData]的时候,又走了一遍代理方法,给headerView中的按钮重新赋值了。如下:
1 | - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { |
解决办法
- 1.修改按钮的tag值。
1 | - (void)buttonClicked:(UIButton *)sender{ |
- 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了。