UITableViewCell单多行操作,侧滑操作列表

作者:计算机知识

UITableViewCell的多选在多数应用中都是很分布的操作,经常的开荒者认为这是三个很复杂的操作,富含小编,知道本身在网络来看了一个demo,开掘原来达成UITableViewCell的多选真的只供给40行代码左右,有些写法让自家万象更新,原本真的独有那样轻巧

第一大家来了然iOS的单行删除:
在 tableView 中一时我们会对其张开增删操作,首假设应用系统的,并非自定义的.

UITableViewCell单多行操作,侧滑操作列表。动用情形之一:购物车的时候用到

曾经

我们都驾驭 UITableView 帮忙落到实处侧滑操作,日常用来落到实处删除一个项目,落成起来也非常粗略,只供给完毕 UITableView 的五个代理方法

  • 第一报告UITableView大家须要得以完成的操作类型,比如再次来到八个.delete
public func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {
    return .delete
}
  • 下一场告诉 UITableView 侧滑时删除开关上显示的文字
func tableView(_ tableView: UITableView, titleForDeleteConfirmationButtonForRowAt indexPath: IndexPath) -> String? {
    return "Delete"
}
  • 终极完成开关触发后进行的操作
public func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    // Do somthing
}

几个档期的顺序下来,我们对那个三部曲早已经是倒背如流了。不过一时候会想,二个轻易易行的操作按键,要求完毕多少个Delegate 方法来完成效果,会不会太繁缛了。。。

并且还会有一件更坑的业务:editingStyleForRowtitleForDeleteConfirmationButton那八个形式归属UITableViewDelegate协议,而commit editingStyle本条点子归于UITableViewDataSource协议。

那表示,假使您为UITableView落到实处了通用的DataSource说道,那么要兑现侧滑操作就不可制止要破坏代码布局了。。。

别的,侧滑协理多项操作的要求尤其旺盛,而此刻大家的优良三部曲已经无法胜任专门的职业了。

那时要么选用第三方的兑现方案,做好随即被坑的预备;要么,自身去落到实处二个更加大的。。。坑?

- viewDidLoad { [super viewDidLoad];//tableView和dataArray 都定义了属性,没有贴出 self.tableView = [[UITableView alloc] init]; self.tableView.frame = self.view.bounds; self.tableView.delegate = self; self.tableView.dataSource = self; [self.view addSubview:self.tableView]; self.dataArray = [NSArray arrayWithObjects:@"数据1",@"数据2",@"数据3",@"数据4",@"数据5",nil];//开启tableView的编辑模式 [self.tableView setEditing:YES animated:YES];}-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return self.dataArray.count;}-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];; cell.textLabel.text = self.dataArray[indexPath.row]; return cell;}- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{//必须返回这个,返回这个才是我们想要的效果(非选中cell左边有个圆圈,选中后有蓝色的对勾,下面有图) return UITableViewCellEditingStyleDelete | UITableViewCellEditingStyleInsert;}-tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ [self updateDataWithTableview:tableView];}-tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath{ [self updateDataWithTableview:tableView];}- updateDataWithTableview:(UITableView *)tableView{ NSArray *indexpaths = [tableView indexPathsForSelectedRows]; NSMutableArray * selectedItems = [NSMutableArray array]; for (NSIndexPath *indexpath in indexpaths) { UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexpath]; [selectedItems addObject:cell.textLabel.text]; } NSLog(@"选中的cell上的标题数组: %@ n 选中的行数组: %@",[selectedItems componentsJoinedByString:@";"],indexpaths);}
对于系统的可编辑状态我们可以看到有三种:
UITableViewCellEditingStyleNone, 
UITableViewCellEditingStyleDelete, 
UITableViewCellEditingStyleInsert

1、设置cell可多选属性

iOS 8 之后

估计苹果的技术员也为自身这些天分的设计折服了吧,于是在 iOS 8 引进了一个新的 API:UITableViewRowAction,先来看一看定义压压惊:

@available(iOS 8.0, *)
open class UITableViewRowAction : NSObject, NSCopying {

    public convenience init(style: UITableViewRowActionStyle, title: String?, handler: @escaping (UITableViewRowAction, IndexPath) -> Swift.Void)

    open var style: UITableViewRowActionStyle { get }

    open var title: String?

    @NSCopying open var backgroundColor: UIColor? // default background color is dependent on style

    @NSCopying open var backgroundEffect: UIVisualEffect?
}

先来看布局器,便利构造器接收四个性情:styletitlehandler

title本条毫无说了,肯定正是按键显示的题目了。

style透过定义能够看见,是二个UITableViewRowActionStyle品类的枚举值,通过布局器传入之后便不可改良了,想来是调节操作按键的显示样式的吗,destructive以此单词是还是不是很熟谙?

@available(iOS 8.0, *)
public enum UITableViewRowActionStyle : Int {
    case `default`
    case destructive
    case normal
}

波澜起伏往下见到handler,这是二个闭包,明显是用来响应开关点击事件的了,终于不用其余实现三个Delegate艺术去响应操作事件了么?自从 iOS 4 之后引进了 block,苹果已经一发不可整理了,API 退换阵容正在途中。。。

class 定义里面还会有多个性情:

首先阅览backgroundColor,字面意思很好通晓,就是背景颜色了,前面注释了一行小字:default background color is dependent on style

那注明了大家的估量:style本性决定了按键的样式,也正是背景颜色,当然,我们也足以由此backgroundColor温馨其它钦定背景象。

最后叁特性能是backgroundEffect,是UIVisualEffect类型的。UIVisualEffect?!那是甚?有经历的同学都晓得,那是 iOS 7 之后引进的毛玻璃特效啊,但是钻探了半天开掘并不曾卵用。也说不佳是自个儿打开的法子不对?有知道的同桌能够教导下。。。

来大家看看效果图

图片 1

_tableV.allowsMultipleSelection = YES;

实践

好了,看完了类定义,赶紧来看看怎么采用呢。先看一下UITableViewDelegate的定义,关于UITableViewRowAction只定义了一个艺术:

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]?

算是决定抛弃三部曲了么,再次来到值是个数组,那是补助八个操作项的旋律啊,废话少说上代码:

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
    let defaultAction = UITableViewRowAction(style: .default, title: "Default")     { (action, indexPath) in
        self.alertTitle("Default action at (indexPath)")
    }
    let normalAction = UITableViewRowAction(style: .normal, title: "Normal") { (action, indexPath) in
        self.alertTitle("Normal action at (indexPath)")
    }
    let destructiveAction = UITableViewRowAction(style: .destructive, title: "Delete") { (action, indexPath) in
        self.alertTitle("Delete action at (indexPath)")
    }
    return [defaultAction, normalAction, destructiveAction]
}

func alertTitle(_ title: String) {
    let alert = UIAlertController(title: title, message: nil, preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "Cancel", style: .cancel))
    present(alert, animated: true)
}

那边定义了三个UITableViewRowAction,分别对应分歧的style,运营之后方可窥见,defaultdestructive暗许都以深红,normal默许是浅蓝色。这里只是简短定义了三个alertTitle方法用来响应点击反馈,实际项目中需求替换到特定的作业逻辑。

图片 2WechatIMG6.jpeg

图片 3

2、设置cell选拔处境

结语

于今停止算是水完了UITableViewRowAction连锁的内容,纵然那是个 iOS 8 就出来的特色了,可是近期才被作者细心到,并且还尚无把backgroundEffect质量的特征摸清,实乃惭愧。

好音信是当今多数 App 都是起码援救 iOS 8 了吧?可以再也不用写繁杂的三部曲了。

探访调节台的打字与印刷

图片 4

cell.selectionStyle =UITableViewCellSelectionStyleNone

图片 5WechatIMG4.jpeg

跟着大家再来明白iOS的多行操作;举个例子上边包车型大巴图所示:

3、在cell上自定义一个精选Button(自定义名字为:checkBtn卡塔尔国,Button的selected属性跟cell里的selected的性质绑定。设置Button的三种景况:UIControlStateNormal和UIControlStateSelected的两样景色图片。

多选过cell之后,大家能够根据数组的新闻得到相应的模子或许相应的数额开展接下去的操作

图片 6

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {

本文由bwin必赢发布,转载请注明来源

关键词: Sw 多选 操作 IOS累之用之 OC开发