1

我正在尝试实现一个“设置页面”,例如拆分视图,左侧是表格视图,右侧是图像视图。一切都很好,但是如果尝试更快地点击它,表格视图单元格触摸会出现延迟。DidSelectRowAtIndexpath 没有被调用,但单元格闪烁。

我试过的,

  1. 图像更改逻辑移至willSelectRowAtIndexPathfromDidSelectRowAtIndex

  2. 从委托方法中删除所有内容(检查是否是由于加载图像)

我该如何解决这个有线问题?

表数据源

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *cellIdentifier = @"tutorialCell";
        CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        if (cell == nil) {
            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"TutorialTableCell" owner:nil options:nil];
            cell = [nib objectAtIndex:0];        
        }
        NSDictionary * dic = [dictArray objectAtIndex:indexPath.row];
        cell.tutorialText.text = [dic valueForKey:TUTORIAL_TEXT];
        cell.tutorialImage.image = [UIImage imageNamed:[dic valueForKey:TUTORIAL_ICON]];
        cell.contentView.backgroundColor = [UIColor colorWithHex:@"#36393D" alpha:1.0];
        UIView *bgColorView = [[UIView alloc] init];
        [bgColorView setBackgroundColor:[UIColor colorWithHex:@"#1f1f1f" alpha:1.0]];
        [cell setSelectedBackgroundView:bgColorView];
        return cell;
    }

表视图委托

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSDictionary * dic = [dictArray objectAtIndex:indexPath.row];
    _tutorialImageView.image = [UIImage imageNamed:[dic valueForKey:TUTORIAL_IMAGE]];
}
4

2 回答 2

2

delaysContentTouchesUITableViews 是默认启用的 UIScrollViews 的子类。这是因为 UIScrollView 在允许触摸转到其子视图之前尝试确定触摸是否是滑动手势或滚动动作的一部分。如果您真的想禁用该操作,您可以通过将delaysContentTouches表视图的设置为 NO。这可能会使滚动行为有点奇怪,因为点击会立即转到表格视图的单元格。您可能会发现您实际上比非延迟触摸动作更喜欢延迟触摸动作。

编辑克莱门特说他已经尝试过了,所以这是另一个想法。

在发布的代码中,您imageNamed:至少最初是从磁盘 ( ) 加载这些图像。UIKit 可能会做一些缓存。如果您的教程图像非常大,您可能无法更快地加载它们,因此请提前加载它们。您可以使用相同的[dic valueForKey:TUTORIAL_IMAGE]键加载所有图像并将它们放入字典中。然后,tableView:didSelectRowAtIndexPath:您可以设置_tutorialImageView.image为字典中的(已加载的)图像之一。

于 2013-03-25T06:23:11.860 回答
0

这可能是图像加载代码。我在这里有两个建议:

一个。如果图像不是太多,您可以将它们全部加载并缓存在 NSArray 中。

湾。如果内存是一个问题,我建议首先显示一个占位符图像和/或 UIActivityIndi​​cator,然后在主线程之外的单独线程中加载主图像。

于 2013-03-25T07:43:07.780 回答