寫了好多的tableview,只是把常用的tableview的應用場景給大家介紹下,(^__^) 嘻嘻……,話不多說,今天介紹的是一個簡單的可以展開和收縮的tableview,類似於qq好友類表。
首先,猶豫是簡單的demo,我們就自己構造資料。
for (int i = 0; i < 4; i++) {
BaseDataModel *model = [[BaseDataModel alloc] init];
model.isOpen = NO;
NSString *name = [NSString stringWithFormat:@"Section:%d",i];
model.name = name;
NSMutableArray *array = [NSMutableArray arrayWithCapacity:5];
for (int j = 0; j < 4; j++) {
NSString *cellName = [NSString stringWithFormat:@"Cell:%d",j];
[array addObject:cellName];
}
model.dataArray = array;
[self.dataArray addObject:model];
}
複製程式碼
BaseModel是我們的一個model類。OK,當我們的資料構造好了,接下來就是設計我們的tableview裡的section-headerview,主要是給headerview新增一個點選事件,之後在我們的mainviewcontroller裡響應,這邊可以有很多種解決方法(可以delegate,也可以block,也可以通知)。我用的是block,相對來說簡單點。tap事件程式碼如下:
if (_isOpen) {
[UIView animateWithDuration:0.3 animations:^{
_imageView.transform = CGAffineTransformRotate(_imageView.transform, -M_PI / 2);
}];
self.closeblock(self.section);
}else{
[UIView animateWithDuration:0.3 animations:^{
_imageView.transform = CGAffineTransformRotate(_imageView.transform, M_PI / 2);
}];
self.openblock(self.section);
}
self.isOpen = !self.isOpen;
複製程式碼
回到我們的mainviewcontroller裡:
HeaderView *headerView = [[HeaderView alloc] initWithFrame:CGRectMake(0, 0, WIDTH, 40)];
headerView.nameLabel.text = model.name;
headerView.section = section;
__weak typeof(self) weakself = self;
headerView.openblock =^(NSInteger secion){
[weakself openSection:section];
};
headerView.closeblock = ^(NSInteger section){
[weakself closeSection:section];
};
複製程式碼
展開的方法是:
BaseDataModel *model = self.dataArray[section];
model.isOpen = !model.isOpen;
NSMutableArray *indexArray = [NSMutableArray arrayWithCapacity:10];
for (int i = 0; i < model.dataArray.count; i++) {
NSIndexPath *indexpath = [NSIndexPath indexPathForRow:i inSection:section];
[indexArray addObject:indexpath];
}
[self.tableView insertRowsAtIndexPaths:indexArray withRowAnimation:UITableViewRowAnimationFade];
複製程式碼
關閉的方法是:
BaseDataModel *model = self.dataArray[section];
model.isOpen = !model.isOpen;
NSMutableArray *indexArray = [NSMutableArray arrayWithCapacity:10];
for (int i = 0; i < model.dataArray.count; i++) {
NSIndexPath *indexpath = [NSIndexPath indexPathForRow:i inSection:section];
[indexArray addObject:indexpath];
}
[self.tableView deleteRowsAtIndexPaths:indexArray withRowAnimation:UITableViewRowAnimationFade];
複製程式碼
由於當你刪除或者新增資料的時候,對應的datasource也要做出相應的改變,所以在返回numberOfRowsInSection時:
BaseDataModel *model = self.dataArray[section];
if (model.isOpen) {
return model.dataArray.count;
}else{
return 0;
}
複製程式碼
因為tableView有自己的重用機制,sectionHeaderView也會被重用,所以如果不設定好資料來源多的時候會亂掉,在MVC的設計模式裡,用於控制View的狀態的是model,於是可以將控制狀態的引數寫入init初始化裡:
- (instancetype)initWithFrame:(CGRect)frame IsOpen:(BOOL)isOpen {
if (self = [super initWithFrame:frame]) {
self.backgroundColor = [UIColor whiteColor];
[self addSubview:self.nameLabel];
[self addSubview:self.imageView];
[self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapOpen)]];
self.isOpen = isOpen;
if (self.isOpen) {
_imageView.transform = CGAffineTransformRotate(_imageView.transform, M_PI / 2);
}
}
return self;
}
複製程式碼
這樣的話,一個簡單的展開收縮的tableview就完成了。
demo地址:https://github.com/ioscick/Extand-TableView
歡迎各位閱讀,希望能幫到各位,如果有不正確的地方也可以一起探討~ thanks。