UITableViewCell并不总是可以选择?

时间:2011-01-13 02:32:26

标签: iphone objective-c uitableview

我正在尝试使用新应用调试问题,但有些事情是不对的。在应用程序中,我通过将2个UILabel和1个UIImageView直接添加到cell.contentView

来设置自定义UITableViewCells

在我的应用中,某些表格视图单元格无法选择(它们没有响应点击事件)。屏幕上的第二个单元格始终无法选择,然后随机的其他单元格也无法选择。

在我调试的过程中,我删除了以下几个基本代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  static NSString *CellIdentifier = @"ReviewCell";
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
  }
  cell.textLabel.text = @"foo";
  return cell;
}

即使这是通用的锅炉板代码,如下所示:

并非所有细胞都是可选择的。

我错过了什么?

更新

如果感兴趣的话,这里更新的是我的行选择代码

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    ReviewWebViewController *rvc = [[ReviewWebViewController alloc] initWithReview:[self.reviews objectAtIndex:indexPath.row]];
    [self.navigationController pushViewController:rvc animated:YES];
    [rvc release], rvc=nil;
}

6 个答案:

答案 0 :(得分:4)

我已经提到很多事情,我不会重复这些事情。

但请确保添加到UITableViewCell的元素将userInteractionEnabled设置为NO。特别是在不使用IB时,不要对默认值做太多假设。

答案 1 :(得分:2)

几个星期前,我被一个类似的声音漏掉了。我在滚动视图中有按钮没有响应触摸。事实证明,这是一个隐形的UILabel,我留在我的IB档案中,从未填充过文字而忘记了。它坐在按钮上并拦截他们的触摸。

我发现它的方式是遍历滚动视图的所有子视图,将每个视图的背景颜色变为黄色。你有一个干扰触摸的迷路视图吗?

您还可以尝试将单元格中的标签和图像调整为微小的(10x10)以查看它们是否在干扰。 作为最后的手段,您可以从新的代码开始,然后添加部分内容以查看它的中断位置。

最后一点:您说您使用的是自定义UITableViewCell,但是使用默认类型初始化单元格:

cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                               reuseIdentifier:CellIdentifier] autorelease];

您不应该在这里使用自定义单元吗?这仅仅是为了简化示例吗?

答案 2 :(得分:1)

我尝试了一个示例应用程序,它完全模仿了你的方法。这一切都很好。我想知道为什么当上面提到的每一段代码都正确时你的代码不起作用。如果需要,我可以与您分享我的代码。我使用以下代码

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    NSLog(@"Row Tapped At %d",indexPath.row);
    NextViewController *rvc = [[NextViewController alloc] initWithReview:[self.reviews objectAtIndex:indexPath.row]];
    [self.navigationController pushViewController:rvc animated:YES];
    [rvc release], rvc=nil;

}

,其中      评论* first = [[[review alloc] initWithReviewId:1 andTitle:@“First”] autorelease];等等... self.reviews = [[NSArray alloc] initWithObjects:first,second,third,fourth,fifth,six,seven,eight,nine,ten,11,12,thirteen,fourteen,fifteen,sizteen,nil];

我正在使用iPhone SDK 4.2。请让我知道如果这模仿你的方法并纠正我如果我犯了任何错误。 感谢

答案 3 :(得分:1)

如果Nevan的解决方案无效,请尝试删除tableView:didSelectRowAtIndexPath方法(或将其注释掉),并在点击时查看按钮是否与蓝色高光一起亮起。如果他们这样做,那么我会怀疑

ReviewWebViewController *rvc = [[ReviewWebViewController alloc] initWithReview:[self.reviews objectAtIndex:indexPath.row]];

并不总是返回一个对象。要确认这一点,请在以下行中设置断点并检查rvc是否为空。如果是,那就是问题。

答案 4 :(得分:1)

当您取出dequeueReusableCellWithIdentifier:codepath并始终使用新单元格时会发生什么 - 它们都可以选择吗?

是否有UITableViewController的父视图,其框架可以设置为小于tableView的边界?如果是这样,那么在父视图之外的触摸将不会在tableView中注册。只要父级的clipSubviews为NO,您仍然可以看到完整的tableView。

此外,请检查您的应用程序窗口是否在笔尖中设置了“想要全屏启动”。如果没有,则窗口的大小可能不正确,触摸事件可能无法到达您的桌面视图。

答案 5 :(得分:1)

您的视图层次结构是什么样的?我会想到两件事:除了表视图之外还有其他视图可以拦截触摸事件,或者表视图本身在其超视图框之外(并且剪切已关闭)。

长话短说 - 关于表视图本身的实现的很多建议,我会看看它周围的一切。