iphone索引表视图问题

时间:2009-06-30 17:07:03

标签: iphone uitableview indexing

我有一个表视图,其中我使用sectionIndexTitlesForTableView来显示索引。但是,当我滚动表格时,索引会滚动它。这也导致表的刷新非常缓慢。有什么明显的东西我可能做错了吗?我希望索引在表格滚动时保持在右侧。这是我用于索引标题的代码:

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
    NSMutableArray *tempArray = [[NSMutableArray alloc] init];
    [tempArray addObject:@"A"];
    [tempArray addObject:@"B"];
    [tempArray addObject:@"C"];
    [tempArray addObject:@"D"];
...

    return tempArray; 
}

3 个答案:

答案 0 :(得分:3)

您确实应该在其他地方创建索引列表(例如,在表控制器的init或loadView方法中),并将其保留为实例变量供以后使用。然后在sectionIndexTitlesForTableView你只需要返回那个ivar。如果它不是具有retain属性的属性,那么请确保在创建时保留它以使其保持不变(并在dealloc中释放它。)

创建它的简便方法是:

self.alphabetIndex = [NSArray arrayWithArray:
   [@"A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|#"
         componentsSeparatedByString:@"|"]];

实际的字母必须根据语言区域设置进行更改,但这样可以更容易本地化。

你绝对不希望每次都创建那个临时数组,因为它会被调用很多。

就索引滚动而言,它可能与您每次返回一个新数组有关。首先尝试上面的内容,如果它没有解决问题,那么您可能需要调整表的sectionIndexMinimumDisplayRowCount属性的值,看看它是否有任何区别。

答案 1 :(得分:1)

我会避免创建一个新的NSMutableArray并每次都释放它。尝试在viewDidLoad或类构造函数上创建它们,只需引用sectionIndexTitesForTableView上的预构建数组。

如果您根本不操作数组,则可能根本不需要NSMutableArray的开销。尝试使用arrayWithObjects静态自动释放构造函数将其切换为普通的NSArray

这应该会为你加快速度。

答案 2 :(得分:1)

创建一个静态变量,它将在app退出时释放。

static NSMutableArray* alphabet = nil;

+ (void)initialize {
    if(self == [MyViewController class]){
        NSUInteger const length = 'Z' - 'A' + 1;
        alphabet = [[NSMutableArray alloc] initWithCapacity:length];
        for(NSUInteger i=0; i<length; ++i){
            unichar chr = 'A' + i;
            [alphabet addObject:[NSString stringWithCharacters:&chr length:1]];
        }
    }
}