2

我正在实现 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 硬编码的唯一方法?

谢谢

4

3 回答 3

1

前几天晚上我正在阅读关于UINib 课程的文档,它正在谈论它如何缓存 nib 的内部结构,以便重复请求执行得更快。这可能是适合您的选择。

于 2011-02-01T02:28:48.057 回答
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;
}

这应该为您提供在代码中创建视图的灵活性,但也希望将其保存在内存中并为您缓存。试试看!

于 2011-02-01T02:32:54.723 回答
0

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

于 2011-02-01T02:22:20.653 回答