在 UITableViewCell 中的任意位置向左或向右滑动以删除没有删除按钮的单元格?
Posted
技术标签:
【中文标题】在 UITableViewCell 中的任意位置向左或向右滑动以删除没有删除按钮的单元格?【英文标题】:Swipe left or right anywhere in a UITableViewCell to delete the cell with no delete button? 【发布时间】:2012-01-30 06:11:18 【问题描述】:我希望能够在表格视图单元格中的任意位置向左或向右滑动,以在不显示删除按钮的情况下用动画擦除单元格。我该怎么做?
【问题讨论】:
【参考方案1】:我还没有尝试并实现过这个,但我会试一试。首先,创建一个自定义 UITableViewCell,并让它有 2 个可以使用的属性
-
对正在使用的 tableView 的引用。
用于在 tableView 中查找单元格的 indexPath。(注意,每次删除所有更改单元格的单元格时都需要更新此路径)
在您创建自定义单元格的cellForRowAtIndexPath:
中,设置这些属性。还将 UISwipeGestureRecognizer 添加到单元格
cell.tableView=tableView;
cell.indexPath=indexPath;
UISwipeGestureRecognizer *swipeGestureRecognizer=[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(deleteCell:)];
[cell addGestureRecognizer:swipeGestureRecognizer];
[swipeGestureRecognizer release];
确保手势只接收水平滑动。
-(BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
if([[gestureRecognizer view] isKindOfClass:[UITableViewCell class]]&&
((UISwipeGestureRecognizer*)gestureRecognizer.direction==UISwipeGestureRecognizerDirectionLeft
||(UISwipeGestureRecognizer*)gestureRecognizer.direction==UISwipeGestureRecognizerDirectionRight)) return YES;
在你的deleteCell:
-(void) deleteCell:(UIGestureRecognizer*)gestureRec
UIGestureRecognizer *swipeGestureRecognizer=(UISwipeGestureRecognizer*)gestureRec;
CustomCell *cell=[swipeGestureRecognizer view];
UITableView *tableView=cell.tableView;
NSIndexPath *indexPath=cell.indexPath;
//you can now use these two to perform delete operation
【讨论】:
不要忘记在首次初始化手势识别器以将其添加到单元格时,您需要为其设置方向。像这样:swipeGestureRecognizer.direction = UISwipeGestureRecognizerDirectionRight; 苹果,该死的你不提供(void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector
。【参考方案2】:
@MadhavanRP 发布的解决方案有效,但它比需要的复杂。您可以采用更简单的方法并创建一个手势识别器来处理表格中发生的所有滑动,然后获取滑动的位置以确定用户滑动的单元格。
设置手势识别器:
- (void)setUpLeftSwipe
UISwipeGestureRecognizer *recognizer;
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self
action:@selector(swipeLeft:)];
[recognizer setDirection:UISwipeGestureRecognizerDirectionLeft];
[self.tableView addGestureRecognizer:recognizer];
recognizer.delegate = self;
在viewDidLoad
调用这个方法
处理滑动:
- (void)swipeLeft:(UISwipeGestureRecognizer *)gestureRecognizer
CGPoint location = [gestureRecognizer locationInView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:location];
... do something with cell now that i have the indexpath, maybe save the world? ...
注意:您的 vc 必须实现手势识别器委托。
【讨论】:
【参考方案3】:实现
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath;
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath;
这两种方法,如果 UITableViewCellEditingStyle 是 UITableViewCellEditingStyleDelete,那么做某事来擦除你的单元格
- (void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
就是这样。
【讨论】:
【参考方案4】:为此,您必须在项目中添加此代码。
// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
// Return YES if you want the specified item to be editable.
return YES;
// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
if (editingStyle == UITableViewCellEditingStyleDelete)
//add code here for when you hit delete
其他信息你可以通过这个链接 enter link description here
【讨论】:
Vivek2012 和 iWill - 感谢您的回复,但我不想显示删除按钮,*** 中已经有答案。我希望单元格在收到向左或向右滑动手势的那一刻被删除。请阅读我的描述谢谢以上是关于在 UITableViewCell 中的任意位置向左或向右滑动以删除没有删除按钮的单元格?的主要内容,如果未能解决你的问题,请参考以下文章
UILabel 文本在 UITableViewCell 中的位置
iOS:如何将 UITableViewCell 附件按钮向左移动