UITableView的编辑模式
实现UITableView简单的删除功能(左滑出现删除按钮)
首先UITableView需要进入编辑模式。实现下面的方法,即使什么代码也不写也会进入编辑模式:
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { // 首先修改model [self.books removeObjectAtIndex:indexPath.row]; // 之后更新view [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; }
- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath { return @"删除"; }
在一些应用中可能会看到,当用户点击一个按钮的时候,UITableView里面的cell的左边会出现一个红色圆,里面是一个-,当点击这个-的时候会出现左滑效果,出现Delete按钮。如何实现的呢?
UITableView有一个editing属性,如果将这个属性设置为YES,那么就会进入编辑模式;同样,设置为NO,就会退出。
上面的提到的例子,当用户点击按钮的时候,就进入编辑模式,编辑模式默认的形式就是在左边有一个红色-,当用户点击的时候自带左滑效果出现Delete按钮。当用户点击Delete按钮的时候又会调用上面提到的方法。
所以说了这么多,只需要将editing设置为YES并实现上面的方法就可以达到上述效果。
UITableViewCell的重用
UITableViewCell如果在tableView:cellForRowAtIndexPath:方法中,像其他类一样,使用下面的方式创建:
UITableViewCell *cell = [[UITableViewCell alloc] init]; cell.textLabel.text = @"hello"; ...
苹果实际上是帮我们提高了性能了的。假设要显示200行数据,如果同时创建200个cell,那么无疑会非常消耗性能,并且并没有太大的意义——因为有些cell根本还没有显示出来。
所以在使用UITableView的时候,只有在cell即将显示的时候才会调用tableView:cellForRowAtIndexPath:方法,也就是说,如果有200行数据,那么只会创建我们可以看到的cell,而那些看不到的数据,则不会创建对应的cell。
比如在手机屏幕上可以同时显示5个cell(编号为0 - 4),那么当用户向上滑tableView的时候,第6个cell即将出现,而第1个cell还未消失,所以此时会创建6个UITableViewCell。当第7个cell出现,那么第1个cell就会完全从屏幕上消失,此时这个UITableViewCell的对象将被销毁,并且第7个cell被创建。以此类推,当有新的cell出现,那么就会创建一个新的cell,销毁消失的那个cell。
这样虽然不必同时创建200个cell,但是在不断地创建-销毁cell,性能上依然会有问题。
苹果提供的更好的方法是将cell复用,而不是销毁。
每次有新的cell出现的时候(也就是tableView:cellForRowAtIndexPath:方法执行的时候),不应该直接创建一个cell,而是应该去缓冲池中查找有没有可复用的cell,如果有,那么就重用这个cell;如果没有,则创建一个cell。这样无论数据是200行,2000行还是20000行,实际上创建的只是屏幕可见的cell的个数。
还是上面的例子,当第7个cell即将出现,第1个cell消失,此时并不会销毁第一个cell,而是将它放入缓冲池中等待复用。此时第7个cell会首先去缓冲池中寻找是否有可复用的cell,发现有(就是消失的第1个cell),那么就会拿来复用,而不是重新创建。这样一来,消失一个,下次就会重用这个,这样就可以保证创建最少数量的cell,仍然可以满足需求。
实现cell的重用可以采用下面的方法:
使用代码自己来创建新的cell:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSString * const cellIdentifier = @"CellIdentifier"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if (!cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier]; cell.backgroundColor = [UIColor greenColor]; } cell.textLabel.text = @"hello";return cell; }
当cell为nil,需要创建新的cell的时候,使用的是initWithStyle:reuseIdentifier:方法,而不是init方法,这样做是因为创建新的cell的时候需要绑定一个identifier,这样在重用的时候才能找到可重用的相同类型。如果使用init方法则没有绑定identifier,这样在重用的时候无法成功找到对应的可重用的cell。
一般在if(!cell)中,也就是在新创建cell的时候,将一些只需要初始化一次的属性进行初始化,而不是在这个括号的外面。因为在括号外面会执行多次,而这些属性并不需要多次设置。同样,如果不同的cell需要设置不同属性或数据,那么需要在括号外执行,因为括号外面每次cell出现都会执行到,这样可以保证不用的cell对应不同的属性或数据。如果将本该设置不同cell对应不同属性的代码放在括号里面,在复用cell的时候不会重新覆盖这些数据,会出现不正确的结果,早晨数据冗余的问题。
另一种方法是自动创建新的cell:
NSString * const cellIdentifier = @"CellIdentifier";- (void)viewDidLoad { [super viewDidLoad];
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:cellIdentifier]; }
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
cell.textLabel.text = @"hello";
return cell; }
这个方法省去了我们自己手动创建cell,但是也有不足:苹果提供给我们的cell的样式,除了默认的,我们都不能用了。
第一种方法我们通过手动创建cell,使用initWithStyle:reuseIdentifier:可以传入不同的style来创建苹果为我们提供的cell,但是在第二种方法中无法实现了。
第二种方法更多的时候用在我们自定义Cell。虽然无法使用更多的系统自带样式,但是我们首先可以注册自定义的cell的类(将UITableViewCell换成自定义的Cell),然后仍然首先去缓冲池中找有没有可重用cell,如果没有,则根据注册的cell来创建cell并绑定identifier。当然,在使用dequeueReusableCellWithIdentifier:的时候,返回的应该也是自定义的Cell类型。
注册的不仅可以是Class,还可以是nib,也就是说可以注册通过xib创建的cell,和上面的方法同理。
还可以直接通过Storyboard,设置好prototype cell的identifier,在dequeueReusableCellWithIdentifier:中就可以直接使用cell,既不用提前注册,也不用手动创建cell。
我已经在我的应用程序中使用了上述代码。编辑部分工作正常,但问题是,只有当我们在单元格上从左向右滑动时,删除按钮才会出现。现在我有了一个菜单,可以像Facebook一样从左向右滑动。那么,我如何确保当用户从右向左滑动时,删除按钮出现呢。
我想实现一个功能,使用Swift 3.0将整个表单元格扫走。比如如何在iOS10的邮件应用程序中滑动删除。 重要的是要注意,我不是指滑动以显示删除按钮,然后处理删除。我的意思是用户可以在屏幕上从右向左滑动来删除。(还要注意,tableView是静态的,而不是动态的) 我必须为此实现UISWipleTestureRecognitor吗?
本文向大家介绍iOS应用中UITableView左滑自定义选项及批量删除的实现,包括了iOS应用中UITableView左滑自定义选项及批量删除的实现的使用技巧和注意事项,需要的朋友参考一下 实现UITableView左滑自定义选项 当UITableView进入编辑模式,在进行左滑操作的cell的右边,默认会出现Delete按钮,如何自定义左滑出现的按钮呢? 只需要实现UITableView下面的
本文向大家介绍iOS中给UITableView的侧滑删除增加多个按钮的实现方法,包括了iOS中给UITableView的侧滑删除增加多个按钮的实现方法的使用技巧和注意事项,需要的朋友参考一下 一. 需求: cell的侧滑删除默认只有一个删除按钮, 给侧滑添加多个按钮, '删除', '置顶', '更多'. 二. 实现说明: 1) 我们在使用一些应用的时候,在滑动一些联系人的某一行的时候,会出现删除
本文向大家介绍Android 实现左滑出现删除选项,包括了Android 实现左滑出现删除选项的使用技巧和注意事项,需要的朋友参考一下 滑动删除的部分主要包含两个部分, 一个是内容区域(用于放置正常显示的view),另一个是操作区域(用于放置删除按钮)。默认情况下,操作区域是不显示的,内容区域的大小是填充整个容 器,操作区域始终位于内容区域的右面。当开始滑动的时候,整个容器中的所有子view都像左