UITableViewCell 变得无响应

Posted

技术标签:

【中文标题】UITableViewCell 变得无响应【英文标题】:UITableViewCell becomes unresponsive 【发布时间】:2012-03-14 14:20:50 【问题描述】:

我有一个弹出屏幕,里面有:

一个标签,可能出现也可能不出现(标题) 搜索栏,可能会出现也可能不会出现 一个标签,可能出现也可能不出现,并且具有可变高度(帮助标签) 一个滚动视图,可能会出现也可能不会出现,并且具有可变高度(有关下表的一些信息) 表格视图

为了展示一些好的东西,在viewDidLoad 中,我移动了各个框架以正确放置对象,并且没有未使用的空间使我的弹出框混乱。此外,然后我调整表格的大小(以占据所需的最大位置),并通过contentSizeInPopover 调整弹出框(以避免出现接近空的巨大弹出框)。所有调整大小似乎都很好,但我有一个大问题:完成所有调整后,我的 UITableView 的某些单元格变得无响应。一两个单元格,通常是第二个单元格,只有在我点击它们的外角时才会响应,但单元格的其余部分完全忽略任何触摸。

我已经尝试了所有方法:将所有内容移至viewWillAppear,让自动调整大小完成其工作(似乎也不起作用),但我每次仍然遇到这个问题。我发现,如果我评论更改表的framecontentSizeInPopover 中涉及的行,问题就会停止,但是我的视图搞砸了,所以这不是解决办法。

如果有人能给我一些东西来摆脱这种混乱,那就太棒了。

- (CGFloat)getHeightWithoutTable 返回 LIST_TITLE_HEIGHT + (self.searchBar.hidden ? 0: LIST_SEARCH_BAR_HEIGHT) + (self.helpLabel.hidden ? 0: self.helpLabel.frame.size.height + LIST_STD_SPACE) + (self.errorScrollView.hidden ? 0: self.errorScrollView。 frame.size.height + LIST_STD_SPACE); -(无效)viewDidLoad [超级视图DidLoad]; self.tableViewOutlet.backgroundView = nil; self.originData = [NSMutableArray 数组]; self.searchedData = [NSMutableArray 数组]; if (self.helper != nil) CGFloat heightOffset = 0; // 内容 self.originData = [self.helper getData]; self.tableData = [NSMutableArray arrayWithArray:self.originData]; // 标题 NSString *title = [self.helper getPopoverTitle]; 如果(标题==无) self.popoverTitle.hidden = 是; 高度偏移-= LIST_TITLE_HEIGHT; 别的 self.popoverTitle.text = [self.helper getPopoverTitle]; // 搜索 if ([self.originData count] [self getStdHeight] / 3) self.helpLabel.lineBreakMode = UILineBreakModeTailTruncation; [self.helpLabel sizeThatFits:CGSizeMake(self.helpLabel.frame.size.width, [self getStdHeight] / 3)]; heightOffset += (self.helpLabel.frame.size.height - LIST_HELP_STD_HEIGHT); // 错误 if ([self.helper respondsToSelector:@selector(getErrors)]) self.errors = [self.helper getErrors]; if (self.errors == nil || [self.errors count] == 0) self.errorScrollView.hidden = 是; self.errorBg.hidden = 是; 高度偏移 -= LIST_ERROR_STD_HEIGHT + LIST_STD_SPACE; 别的 [自我创建错误视图]; heightOffset += (self.errorScrollView.frame.size.height - LIST_ERROR_STD_HEIGHT); // 桌子 CGFloat previewHeight = LIST_CELL_HEIGHT * [self.tableData count] + LIST_STD_SPACE; CGFloat remainingHeight = LIST_MAX_HEIGHT - [self getHeightWithoutTable] - LIST_STD_SPACE; CGFloat tableHeight = MIN(previewHeight, remainingHeight); CGRect tableFrame = self.tableViewOutlet.frame; self.tableViewOutlet.frame = CGRectMake(tableFrame.origin.x, tableFrame.origin.y + heightOffset, LIST_WIDTH, tableHeight); // 选择的项目 if ([helper getSelectedObject] != nil) int index = [self.tableData indexOfObject:[helper getSelectedObject]]; NSIndexPath *indexPath = [NSIndexPath indexPathForRow:index inSection:0]; [self.tableViewOutlet scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop 动画:YES]; - (CGSize)contentSizeForViewInPopover if (self.navigationController) 返回 CGSizeMake(LIST_WIDTH, LIST_MAX_HEIGHT); 别的 CGFloat totalHeight = [self getHeightWithoutTable] + self.tableViewOutlet.frame.size.height + LIST_STD_SPACE; 返回 CGSizeMake(LIST_WIDTH, totalHeight);

(gist如果你需要一些颜色来帮助你)

笔尖的图片:

【问题讨论】:

【参考方案1】:

只是在黑暗中拍摄,因为您没有提供任何代码。如果您要向 UITableCellView 添加内容,请记住许多组件的 UserInteractionEnabled 设置为 NO,这将禁用与其交互的能力。确保您添加到单元格中的任何可能占用您正在点击的空间的项目(大概是单元格的中心?)将其UserInteractionEnabled 设置为YES

边缘可能仍然有效的原因是 UITableCellView 由 3 个主要部分组成,因此您可能只更改中心部分。

发布一些代码,我们可以更好地查看。

【讨论】:

【参考方案2】:

自己找到了答案:事实上我在 UITableView 旁边使用了一个自填充的 UIScrollView 似乎是问题所在。一旦我将 UIScrollView 替换为适当的 UITableView,问题就消失了。

【讨论】:

以上是关于UITableViewCell 变得无响应的主要内容,如果未能解决你的问题,请参考以下文章

进入主队列后 UI 变得无响应

播放框架变得无响应? (可能是内存问题)

旋转的 UIView 变得无响应

随着时间的推移,使用 java websockets 实时流式传输模拟视频变得无响应

UITableviewcell的性能问题

OnTime 不到 1 秒而没有变得无响应