自定义 UITableView 部分标题视图正在破坏

Posted

技术标签:

【中文标题】自定义 UITableView 部分标题视图正在破坏【英文标题】:Custom UITableView section header views are breaking 【发布时间】:2009-07-21 23:10:39 【问题描述】:

我有一个自定义 UIView 子类,我正在尝试将其用作我的分组 tableview 部分之一的标题。我在 tableViewController 中保存了该视图的一个实例,并使用它来返回标题部分的高度以及视图本身。问题是,在 reloadData 调用过程中,该实例变量以某种方式从 UIView 更改为 CALayer,这会导致崩溃,因为该实例具有返回其预期高度的特殊方法。这是崩溃的代码:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
   
    if (section == 0)
    
        return [self.dataHeader frameHeight];
    
    return 0.0f; 

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

    if (section == 0)
           
        return self.dataHeader;
    
    return nil; 

我在heightForHeaderInSection方法的if块中第一次返回时设置了一个断点,它命中了4次;前三个成功返回 dataHeader ,而第四次显示它是一个 CALayer 并因 dosNotRecognizeSelector 异常而崩溃(如果这有所不同,我的 tableview 有 2 个部分)。发生这种情况有什么原因吗?有没有办法阻止它?

【问题讨论】:

【参考方案1】:

dataHeader 的初始化代码是什么样的?初始化dataHeader时,是否正确保留?

我的猜测是你的 dataHeader 视图在你想要的之前被释放了。

【讨论】:

你是对的;那是个问题。实际上,我从重构中留下了一个自动释放。我明天有机会试试,看看能不能解决它:)。【参考方案2】:

问题似乎是您有 2 个部分,而应用程序认为有 4 个部分。这是我调试此问题的方法:

1) numberOfSectionsInTableView 返回什么(是否实现)?

我假设每个标题方法都应该被调用 n 次,其中 n 是表中的节数。我还假设该应用程序询问上述代表 n 是什么。

2) 每次调用这些委托时,section 的值是多少?

每个部分应该只有一个调用,除非我遗漏了什么,如果委托被多次调用并使用相同的部分值,我会感到惊讶。

【讨论】:

以上是关于自定义 UITableView 部分标题视图正在破坏的主要内容,如果未能解决你的问题,请参考以下文章

可扩展 UiTableView 的自定义单元格

使用自定义 UITableView 子视图

自定义 UITableView 部分索引

tableView:viewForHeaderInSection: 如何准确工作以及如何动态自定义此视图

从 UITableView 中删除自定义视图

UITableView 部分标题 1px 光泽/阴影重叠