点击或长按单元格下方

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'

0x7fff0bc16a20UIView *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

【讨论】:

谢谢。这实际上也是我的第一个想法。但是很难保持最后一个单元格完全填满屏幕(单元格的数量和大小经常变化)。

以上是关于点击或长按单元格下方的主要内容,如果未能解决你的问题,请参考以下文章

长按手势操作表删除单元格

如何在单元格下方的表格视图中检测点击/触摸?

直接在导航栏下方滚动表格视图单元格?

更改长按 uiTableView IOS 上的单元格选择

AQGridView长按网格单元格检测

如何重新创建 TweetBot 样式的“下拉”单元格菜单?