2

我创建了一个带有 UIView 的自定义 XIB 文件,我希望将其显示在UITableView节中的标题视图中。我正确地实现了所需的委托方法,当然:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:
  (NSInteger)section 
{
    if (tableView == self.messageTableView) {
        TableViewHeaderView *header = [[[NSBundle mainBundle] 
        loadNibNamed:@"TableViewHeaderView" owner:self options:nil] lastObject];

        [header.titleLabel setText:@"A String"];
        [header.addressLabel setText:@"Another String"];

        [header sizeToFit]; //I tried it with and without this line, 
                            //  does not seem to help
        return header;
    }
    return nil;
}

因此,TableViewHeaderView该类是 的子类UIView

一切似乎都很好,实际上我在其他一些项目中也使用了这种方法,一切似乎都很好。尽管如此,我还是遇到了一个非常奇怪且随机的错误:运行应用程序并使用 Tableview 的数据,一些 Sectionheader-Views 有时会像下面的屏幕一样显示不正确。由于我在此论坛中的新帐户,我无法将图片直接粘贴到此帖子中。但是您可以改用该链接(对此感到抱歉):

http://i.stack.imgur.com/JSeVz.png

在这个UITableView例子中有八个部分。正如您可以清楚地看到“发送 3,4,5”的部分标题视图完全放错了位置。当滚动 tableview 时,它们被固定在它们的位置并移动。但是,当您向下滚动表格视图时,它们将再次出现在正确的位置。

顺便说一句:我在这个项目中没有使用AutoLayout,视图有一个正确的高度,对应于heightForHeaderInSection:delegate方法,并且与底层tableview本身的宽度相同。HeaderView 以及底层 UITableView 的 Autosizing 设置为:

http://i.stack.imgur.com/Ms0ZC.png

重新加载 tableview 也无济于事。

有谁知道那里出了什么问题?我一点头绪都没有。还是这种使用自定义视图的方法有点过时?

谢谢你的帮助!

4

1 回答 1

0

我想我明白了,虽然这是一个非常个人的错误。

在某些情况下,在相关对象上调用reloadSections:withRowAnimation:方法时会发生错误。UITableView使用reloadData解决了这个问题。

错误本身很难解释,因为这意味着要解释相关应用程序实现的很大一部分。无论如何,我认为这是由于在短时间内执行了很多reloadSections:withRowAnimation:与方法调用混合的结果造成的。reloadData当通过 UDP-Socket 接收到新数据时,我的应用程序对该方法有几个异步调用reloadSections:withRowAnimation:,同时当用户手动执行 tableview 重新加载时(在 tableview 上使用过滤器时 - 视图底部的按钮是用于那个)这实际上可能会导致问题。

我认为一些已经创建的 Sectionheader-views 对象可能不会被清理,因此它们仍然停留在 superview 上。我不确定这是否是正确的解释,但至少问题已解决:)

于 2013-10-14T21:53:52.207 回答