UITableView 重新整理頭部時,頭部每次都變為開始的狀態,無法記錄當前的狀態
阿新 • • 發佈:2019-02-19
比如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]];
}
}
如此就可以實現了。