如何在tableView viewForHeaderInSection中使用NIB加载的UIView而不会影响性能

时间:2009-03-21 18:46:20

标签: iphone uitableview

我正在实现tableView viewForHeaderInSection,我返回一个nib加载的UITableViewCell。

为了这个问题,我简化了它。

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    UIView* header = [CellFactoryController newSectionHeader];
    header.text = "Some Text Depending on the section"
    return header;

}

不幸的是,这非常慢,因为我有时会有50多个标题,当表格绘制时,所有标题都会从nib一次加载,即使这些标题不在视图中。

我是否有任何现实的方法可以克隆UIViews并因此克隆此示例中的标题?或者我是唯一能够创建UIView硬编码头的方法吗?

由于

3 个答案:

答案 0 :(得分:1)

我正在另一个晚上在UINib class上阅读doco,它正在讨论如何缓存nibs内部结构,以便重复请求执行得更快。这可能是适合您的选择。

答案 1 :(得分:1)

好吧,我不知道你是否还需要这个问题的答案,但是......到底是什么。我们开工吧。我将做一些假设,但如果你遇到性能问题,真正解决这个问题的唯一方法就是测试它,如果不了解你的观点的复杂性,我们就无法获得可靠的指标。所以我会假设你已经尝试了一些东西并扔掉那些你可能还没试过的东西。

从nib加载视图时,它会从文件中取消归档。 如果加载发生了50次,那么这可能会对您的性能问题产生很大影响。那么我们还能做些什么呢?好吧,在表视图控制器类中,创建一个类型为NSData的新实例变量。然后,在您的-init方法(或其他指定的初始值设定项)中,从属性列表中加载视图:

- (id)init
{
    self = [super init];

    if (self) {
        // Other initialization code.

        NSString *filePath = [[NSBundle mainBundle] pathForResource:@"MyView"
                                                             ofType:@"plist"];
        myData = [[NSData alloc] initWithContentsOfFile:filePath];
    }

    return self;
}

好的,所以你将这个属性列表加载到NSData。现在,其余部分应该清楚:

- (UIView *)tableView:(UITableView *)tableView
viewForHeaderInSection:(NSInteger)section 
{
    UIView *view = [NSKeyedUnarchiver unarchiveObjectWithData:myData];

    return view;
}

我的目标是始终将完全实例化的视图保留在内存中。但后来我想,“他怎么会创造那个plist?”所以我修改了一下。不是从文件加载数据,而是在代码中创建视图:

- (UIView *)tableView:(UITableView *)tableView
viewForHeaderInSection:(NSInteger)section 
{
    UIView *headerView;

    if (myData == nil) {
        headerView = [[UIView alloc] init];
        // Configure your view, but only that part that isn’t customized.

        myData = [[NSKeyedArchiver archivedDataWithRootObject:headerView] copy];
    } else {
        headerView = [NSKeyedArchiver unarchiveObjectWithData:myData];
    }

    // Now customize the view for your particular section.

    return headerView;
}

这应该可以让您灵活地在代码中创建视图,但希望将其保存在内存中并为您缓存。试试吧!

答案 2 :(得分:0)

您可能会将您的视图分解为单独的.xib文件以加快加载速度,但(正如您所说),您最好的选择可能是在程序上创建这些视图。在quickie示例代码之外,.xib文件通常保留用于整个应用程序或全屏视图所需的非常高级别的容器布局。布局和绘制面向细节的元素 - 例如表格视图中的单元格,页眉和页脚 - 通常可以更好地处理程序。