Iphone 如何在tableView视图ForHeaderInSection中使用NIB加载的UIView而不影响性能

Iphone 如何在tableView视图ForHeaderInSection中使用NIB加载的UIView而不影响性能,iphone,uitableview,Iphone,Uitableview,我正在实现tableView ViewForHeaderIn部分,其中返回一个nib加载的UITableViewCell 为了回答这个问题,我把它简化了 - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { UIView* header = [CellFactoryController newSectionHeader]; header.text = "

我正在实现tableView ViewForHeaderIn部分,其中返回一个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加载,即使这些头不在视图中

在本例中,是否有任何现实的方法可以克隆UIView,从而克隆标头?还是我创建标题的唯一方法是硬编码的UIView


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

前几天晚上,我正在阅读文档,其中谈到如何缓存nibs内部结构,以便重复请求执行得更快。这对你来说可能是个合适的选择。

嗯,我不知道你是否还需要这个问题的答案,但是……见鬼。让我们这样做。我将做一些假设,但是如果你有性能问题,真正解决这个问题的唯一方法就是测试它,如果没有更多关于视图复杂性的知识,我们就无法真正获得可靠的指标。所以我假设你已经尝试了一些东西,然后扔掉了一些你可能还没有尝试过的东西

从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;
}
这将为您提供在代码中创建视图的灵活性,但也希望将其保存在内存中并为您缓存。试试看