点击或长按单元格下方
Posted
技术标签:
【中文标题】点击或长按单元格下方【英文标题】:Tap or LongPress below cells 【发布时间】:2014-11-23 17:49:28 【问题描述】:我想在用户点击或按下UITableView
中最后一个单元格下方时添加一个新单元格,但前提是视图高度大于所有单元格的总高度。
我不想要分隔符,我使用:
myTableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];
改为空白视图。
我尝试更改并将UITapGestureRecognizer
添加到myTableView.tableFooterView
。当有足够的单元格填满屏幕时,他也离开了。我想要的是,它可以在部分空白的屏幕上工作。
我认为在这种情况下不会发送UITableViewDelegate
消息。
编辑
在@LeoNatan 回答后,我尝试了(viewDidLoad
):
UIView *backView = [[UIView alloc] initWithFrame:self.myTableView.frame];
singleTapBack = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapBack:)];
//singleTapBack.delegate = self; // the problem...
singleTapBack.numberOfTapsRequired = 1;
singleTapBack.numberOfTouchesRequired = 1;
[backView addGestureRecognizer:singleTapBack];
self.myTableView.backgroundView = backView;
当我触摸背景时:
-[UIView indexPathForRowAtPoint:]: unrecognized selector sent to instance 0x7fff0bc16a20
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIView indexPathForRowAtPoint:]: unrecognized selector sent to instance 0x7fff0bc16a20'
0x7fff0bc16a20
是 UIView *backView
并且@selector(handleTapBack:)
没有被调用
【问题讨论】:
在我看来,如果您只是指定该部分中的最后一个单元格用于添加另一个单元格,那么这将容易得多,并且样式将是微不足道的。 @JayMorgan:我知道。我提出了一种简单的方法来添加单元格。但是我在测试新用户的过程中观察到,他们在列表下方的空白部分中触摸,有添加一些东西的想法。我想给他们这种可能性。 @Croises:你的handleTapBack
方法中写了什么?问题出在那个方法上。
【参考方案1】:
您可以在表格底部添加一个新的空“新建”单元格。做这样的事情。
@property (strong, nonatomic) UITableViewCell *createNewCell;
- (UITableViewCell *)createNewCell
if (!_createNewCell)
// can be your own nib too
_createNewCell = [self.tableView dequeueReusableCellWithIdentifier:@"CreateNewCell"
_createNewCell.textLabel.text = @"+ New entry";
return _createNewCell;
- (BOOL)isCreateNewCell:(NSIndexPath *)indexPath
return (indexPath.row == modelArray.count + 1);
- (UITableViewCell *)tableView:(UITableView *)view cellForRowAtIndexPath:(NSIndexPath *)indexPath
if ([self isCreateNewCell:indexPath])
return self.createNewCell
// rest of cell configuration
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return modelArray.count + 1;
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
if ([self isCreateNewCell:indexPath])
// do insert stuff or go into edit mode
// do other selection stuff
这将使您的表格视图始终在表格底部有一个额外的单元格。您可以编写自己的行插入和编辑。
如果这不是你想要的,你可以制作一个透明的背景视图。
myTableView.backgroundView = [[UIView alloc] initWithFrame:self.tableView.frame;
myTableView.backgroundView.alpha = 0;
并添加UITapGestureRecognizer
:
UITapGestureRecognizer *tgr = [[UITapGestureRecognizer alloc] initWithTarget:self action:@sel(newCellTapped)];
[myTableView.backgroundView addGestureRecognizer:tgr];
【讨论】:
谢谢,但我不想要列表单元格的底部。我已经有了添加单元格的方法。只是一开始列表是(太)空的。而且我还想在现有单元格下方触摸屏幕时添加一个单元格。但不是在屏幕充满单元格之后。 “当视图大于所有单元格时”是什么意思。什么意思? 对不起我的英语...当屏幕大到可以显示 10 个单元格时。而且屏幕上只有 1 或 2 个。 嗯,好的。我已经在底部添加了我的答案。 非常感谢贾达尔!它真的很好用。我的错误是:singleTapBack.delegate = self;
我刚刚删除了这一行。我在我的所有UITapGestureRecognizer
中都这样做了,没有问题...【参考方案2】:
如果您只想点按表格视图的空白区域,请将backgroundView
添加到表格视图。在该背景视图中,添加您的手势识别器(请记住在背景视图上启用用户交互)。当手势识别器检测到点击时,添加一个带有适当动画的单元格。最后,检查tableView.visibleCells.count
以确定您的表格视图是否包含足够的单元格来填满屏幕。如果是这样,请禁用手势识别器。
【讨论】:
我想过这样做。我的问题是我有一个自动调整单元格的大小。因此,不同大小的细胞。但是一旦背景被单元格掩盖,就没有必要禁用手势识别器。还是有干扰的风险? 有几种方法可以确定单元格是否覆盖表格视图。根据您绘制单元格的方式,您甚至可能无需担心。 是的,您也许可以将手势识别器添加到背景视图中。表格视图通常会拦截单元格上的所有点击,因此背景视图永远不会得到它。值得一试! 我尝试过(通过各种测试和变体),但它不起作用。阅读我的问题编辑(谢谢!)。 检查发送错误消息的视图对象是否与您创建的背景视图相同。这看起来很奇怪。【参考方案3】:好吧,在下面的这种情况下,我会做的。
始终使用 your_size+1 加载 tableview(+1 用于添加空单元格)
加载表格视图时,创建最后一个单元格,该单元格将具有相同大小的按钮。
按下此按钮调用 IBAction
在 IBAction 中,添加单元格并重新加载表格
如果您有任何问题,请告诉我。
如果您担心分隔线,请访问以下链接。
Hide remove separator line if UITableViewCells are empty
【讨论】:
谢谢。这实际上也是我的第一个想法。但是很难保持最后一个单元格完全填满屏幕(单元格的数量和大小经常变化)。以上是关于点击或长按单元格下方的主要内容,如果未能解决你的问题,请参考以下文章