从XIB加载的UITableView Sectionheader有时会显示不正确

时间:2013-10-11 23:43:58

标签: ios objective-c uitableview xib sectionheader

我创建了一个带有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有八个部分。你可以清楚地看到sectionheader-views“发送3,4,5”是完全错位的。当滚动桌面视图时,它们会卡在自己的位置并移动。但是,当您向下滚动桌面视图时,它们将再次出现在正确的位置。

顺便说一下:我在这个项目中没有使用AutoLayout,视图的高度正确,对应于heightForHeaderInSection:委托方法,宽度与底层tableview本身相同。 HeaderView的自动调整大小以及底层的UITableView设置为:

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

重新加载tableview也无济于事。

有没有人知道那里有什么问题?我没有丝毫的线索。或者这种使用自定义视图的方法是旧时代的吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

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

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

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

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