我有一个表视图,其中我使用sectionIndexTitlesForTableView来显示索引。但是,当我滚动表格时,索引会滚动它。这也导致表的刷新非常缓慢。有什么明显的东西我可能做错了吗?我希望索引在表格滚动时保持在右侧。这是我用于索引标题的代码:
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
NSMutableArray *tempArray = [[NSMutableArray alloc] init];
[tempArray addObject:@"A"];
[tempArray addObject:@"B"];
[tempArray addObject:@"C"];
[tempArray addObject:@"D"];
...
return tempArray;
}
答案 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]];
}
}
}