重新加载表格视图和触摸手势

6
我有一个TableView,当新内容添加时,它会被重新加载,使用[tableview reloadData];
问题是我在表格中的TableCell上有一个UILongPressGestureRecognizer,因为单元格/表格经常被重新加载,所以长按手势不总是有时间工作,我猜测它的内部计时器在单元格/表格被重新加载时被重置。

更新频率是多少? - Deepak Danduprolu
细胞发生了什么样的变化?整个表格都会改变,还是只有一个细胞在变化? - EmilioPelaez
表格数据源被添加时,当tableviewcontroller调用[tableview reloadData]时,它会重新加载表格/在表格底部添加一个单元格。 - daihovey
你遇到了什么问题,应该发生什么? - Eiko
有没有办法检测用户是否将手指放在设备上?这样我就可以在手指抬起之前停止调用reloadData... - daihovey
参考你最近的问题daidai;看octy的回答 - 检查UIGestureRecognizer.state并且你就可以继续了。 - Till
3个回答

4

你是否尝试过在调用[tableView reloadData]之前查看你的UILongPressGestureRecognizer状态?例如:

// Returns |YES| if a gesture recognizer began detecting a long tap gesture
- (BOOL)longTapPossible {
    BOOL possible = NO;

    UIGestureRecognizer *gestureRecognizer = nil;
    NSArray *visibleIndexPaths = [tableView indexPathsForVisibleRows];

    for (NSIndexPath *indexPath in visibleIndexPaths) {
        // I suppose you have only one UILongPressGestureRecognizer per cell
        gestureRecognizer = [[tableView cellForRowAtIndexPath:indexPath] gestureRecognizers] 
                                lastObject];
        possible = (gestureRecognizer.state == UIGestureRecognizerStateBegan ||
                    gestureRecognizer.state == UIGestureRecognizerStateChanged);
        if (possible) {
            break;
        }
    }
    return possible;
}

// ... later, where you reload the tableView:

if ([self longTapPossible] == NO) {
    [tableView reloadData];
}

如果它有效,请告诉我!


建议检查 UIGestureRecognizer.state。+1 - Till

3
如果您希望保留现有的单元格,请勿使用reloadData。相反,当您获取新数据时,请使用插入和删除单元格的方法来通知表视图哪些单元格已更改。一般的步骤是:
  1. 获取新数据。
  2. 调用beginUpdates
  3. 调用deleteRowsAtIndexPaths:withRowAnimation:来删除任何在新数据中已被删除的旧项的单元格。
  4. 调用insertRowsAtIndexPaths:withRowAnimation:来添加任何在新数据中已添加的新项的单元格。
  5. 如果您需要选择性地替换某个特定单元格(并且不能只使用新数据更新现有单元格的子视图),请使用reloadRowsAtIndexPaths:withRowAnimation:
  6. 调用commitUpdates。此时,您的UITableViewDataSource方法必须反映新数据(例如,tableView:numberOfRowsInSection:应反映更改后的计数,而tableView:cellForRowAtIndexPath:应使用新项目)。
  7. 表视图现在将根据需要调用您的数据源方法来更新显示。现有行不会更改。

我过去尝试过这种技术,发现reloadData方法对我的系统更好。有没有办法检测用户是否在设备上放置了手指? - daihovey

0
当您触摸单元格时,将BOOL(例如aCellIsSelected)设置为YES,
如果aCellIsSelected为NO,则只需重新加载tableview。

问题在于 UILongPressGestureRecognizer 只有在长时间按压后才会触发。而我无法监听 didSelectRowAtIndexPath,因为它是一个轻触而不是按压,所以也不会被调用。 - daihovey
你可以继承UITableViewCell并在setHighlighted中设置值。 - FoJjen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接