iphone索引表视图问题

Posted

技术标签:

【中文标题】iphone索引表视图问题【英文标题】:iphone indexed table view problem 【发布时间】:2009-06-30 17:07:03 【问题描述】:

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

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

    return tempArray; 

【问题讨论】:

【参考方案1】:

您确实应该在其他地方创建索引列表(例如,在表控制器的 init 或 loadView 方法中)并将其保留为实例变量以供以后使用。然后在sectionIndexTitlesForTableView 你只需要返回那个ivar。如果它不是具有保留属性的属性,请确保在创建时保留它,以便它保留(并在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 属性的值,看看是否有任何不同。

【讨论】:

是的,我怀疑每次都创建数组不是一个好主意,并且已经在实施您建议的解决方案。我现在只是返回字母数组。然而,即使在这样做之后,索引仍然会滚动出去,然后只有在滚动完成后才会弹回原位。这令人费解。为什么索引会滚动?点击或滑动索引本身可以正确滚动表格。我尝试将 myTableView.sectionIndexMinimumDisplayRowCount 设置为一些不同的值 (3,10,20) - 没有任何区别。 也许如果您尝试将其设置为字母索引中的项目数(即 27),它会保持原位。值得一试。 当前表格的行数少于 27 行,所以设置为 27 会导致索引不显示。这当然意味着表格可以完美滚动和显示。但是,每当我显示索引时,表格滚动直到滚动停止才会呈现。 嗯。我建议使用 27,因为 26 个字母加上 '#' 在 alphabetIndex 示例中。如果它仍然以正确的数组元素数向上滚动,那么建议您用完 Apple 开发人员技术支持信用,看看他们是否可以通过查看代码来提供帮助。【参考方案2】:

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

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

这应该会加快你的速度。

【讨论】:

感谢您的建议。我现在有这个: - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView NSArray *tempArray = [NSArray arrayWithObjects:@"A",@"B",@"C", nil];返回临时数组;但它根本没有帮助(表格内容在滚动完成之前不会更新)。我认为主要问题是索引与表格一起滚动。这显然是不正确的——它应该在表格单元格滚动时保持静止。知道为什么会发生这种情况吗? 我不确定“索引与表格一起滚动”是什么意思。每次使用该代码调用该方法时,您仍在创建数组。 如果你使用 sectionIndexTitlesForTableView 确保你也在实现 tableView:sectionForSectionIndexTitle:atIndex: 和 tableView:numberOfRowsInSection:【参考方案3】:

制作一个静态变量,应用退出时释放。

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]];
        
    

【讨论】:

以上是关于iphone索引表视图问题的主要内容,如果未能解决你的问题,请参考以下文章

刷新表视图 iphone

SQL:针对表的视图 - 针对视图的查询是不是仍在使用表索引?

如果我在 sql server 中为表创建索引,看起来索引表的视图会受到影响吗?

iphone表视图滚动中止-无法识别的选择器

分组表视图,如 iphone 联系人

oracle 大表怎么建索引