比如UITableView中头部视图为
点击按钮后,头部进行刷新,头部区域视图改变,并且下面出现cell,如图:
此功能的实现应该用,头部的刷新功能,利用代码:
//刷新表格视图的分区的头视图
[_historyTableView reloadSections:[NSIndexSet indexSetWithIndex:index] withRowAnimation:UITableViewRowAnimationFade];
但是实现过程中会出现一个问题,就是刷新后头部视图部分,开关按钮仍然为灰白按钮,那是因为每次刷新时,都会去重新初始化头部,此开关按钮也就会被重新初始化。由于此开关按钮是自己封装的,所以可以在封装里面的初始化中加一个判断:
需要定义一个bool值,
首先在控制器里面,每次打开开关按钮时将bool置为yes,刷新时,会去封装的代码中进行初始化,所以初始化代码中应:
- (instancetype)initWithframe:(CGRect )frame{
self = [super init];
if (self) {
[self setBackgroundImage:[UIImage imageNamed:@"gray"] forState:UIControlStateNormal];
[self addTarget:self action:@selector(changeImageAndSlide:) forControlEvents:UIControlEventTouchUpInside];
self.frame = frame;
self.tempFrame = frame;
_sliderButton = [[UIButton alloc]initWithFrame:CGRectMake(2, 2, 27, 27)];
if (_isClicked== YES) {
/**
* 点击过后;
*/
[_sliderButton setBackgroundImage:[UIImage imageNamed:@"orange"] forState:UIControlStateNormal];
_sliderButton.frame = CGRectMake(41, 2, 27, 27);
} else {
[_sliderButton setBackgroundImage:[UIImage imageNamed:@"white"] forState:UIControlStateNormal];
_sliderButton.frame = CGRectMake(2, 2, 27, 27);
}
[_sliderButton addTarget:self action:@selector(slide:) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:_sliderButton];
}
return self;
}
这样操作后会发现还是无法实现,那是因为刚才点击的那个头部的开关按钮,点击完后开始刷新,刷新时重新初始化时,又初始化了一个开关按钮,不是刚才点击的那个头部开关按钮了。为了保证刚才点击的头部和等下刷新时的头部是同一个,可以在控制器中初始化头部的代码中这样来实现:
首先声明一个存放的字典:
@property (nonatomic, strong) NSMutableDictionary *BigButtonDic; // 存放表头名称的数组
//为每个分区添加头视图
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
//开关按钮的创建(每次将创建的开关按钮,存到字典中,再次初始化时,如果已经有了,就不好初始化新的了,而是拿出之前的来使用)
ButtonBig *switchBtn = [self.BigButtonDic objectForKey:[NSString stringWithFormat:@"%lu", (long)section]];
if (switchBtn == nil) {
switchBtn = [[ButtonBig alloc]initWithframe:CGRectMake(0, 0, 70, 31)];
[self.BigButtonDic setObject:switchBtn forKey:[NSString stringWithFormat:@"%lu", (long)section]];
}
}
如此就可以实现了。