使用TableView自帶的多選功能
阿新 • • 發佈:2019-01-26
一、簡單實現
1.設定tableView屬性
self.tableView.allowsMultipleSelectionDuringEditing = YES;
2.然後在編輯按鈕顯示tableView編輯狀態
[self.tableView setEditing:YES animated:YES];
3.檢視被選中cell的indexPath陣列
NSArray *indexs = self.tableView.indexPathsForSelectedRows;
二、實戰使用
功能要求:
1.點選多選按鈕,進入多選模式
2.滿足條件的才會出現多選項(部分cell多選)
3.多選狀態下,選中和取消都要獲取(實時計算選中cell中某個值的總和,以及選中數量)
實現:
1.簡單方法無法實現部分多選,所以用另一種方法進入編輯模式
不需要設定
self.tableView.allowsMultipleSelectionDuringEditing = YES;
實現兩個代理方法
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{ if (indexPath.row < 5) { return UITableViewCellEditingStyleDelete | UITableViewCellEditingStyleInsert; }else{ return UITableViewCellEditingStyleNone; } }
ps:row<5 的顯示系統自帶的多選圖示,否則不顯示
- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row < 5) {
return YES;
} else {
return NO;
}
}
ps :row<5 的會有cell向右移動,出現多選按鈕的動作,否則沒有動作,不會出現多選按鈕2.在選中cell的代理方法中,如果在編輯狀態則處理選中事件,否則跳轉其他頁面
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
// 編輯狀態返回
if (tableView.isEditing) {
NSArray *indexs = tableView.indexPathsForSelectedRows;
for (NSIndexPath *index in indexs) {
// 可以取到所有選中cell的index
}
return;
}
// 正常cell點選動作
}
3、編輯狀態如果取消選擇的話不會進入上面方法,需要單獨處理取消事件
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"取消 - %ld",indexPath.row);
}
三、其他設定
1、自帶按鈕顏色設定
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
// ...
directCell.tintColor = MainTone;
// ...
}
2.判斷是否在編輯狀態(可用於編輯狀態 是/否 切換),返回BOOL值
tableView.isEditing
3.自定義多選按鈕(cell中實現)
-(void)layoutSubviews
{
for (UIControl *control in self.subviews){
if ([control isMemberOfClass:NSClassFromString(@"UITableViewCellEditControl")]){
for (UIView *v in control.subviews)
{
if ([v isKindOfClass: [UIImageView class]]) {
UIImageView *img=(UIImageView *)v;
if (self.selected) {
img.image=[UIImage imageNamed:@"xuanzhong_icon"];
}else
{
img.image=[UIImage imageNamed:@"weixuanzhong_icon"];
}
}
}
}
}
[super layoutSubviews];
}
//適配第一次圖片為空的情況
- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
[super setEditing:editing animated:animated];
for (UIControl *control in self.subviews){
if ([control isMemberOfClass:NSClassFromString(@"UITableViewCellEditControl")]){
for (UIView *v in control.subviews)
{
if ([v isKindOfClass: [UIImageView class]]) {
UIImageView *img=(UIImageView *)v;
if (!self.selected) {
img.image=[UIImage imageNamed:@"weixuanzhong_icon"];
}
}
}
}
}
}
4.取消選擇
[tableView deselectRowAtIndexPath:indexPath animated:YES];
四、坑
千萬不要設定
cell.selectionStyle = UITableViewCellSelectionStyleNone;