2009-06-30 3 views
0

У меня есть представление таблицы, в котором я использую sectionIndexTitlesForTableView для отображения индекса. Однако, когда я просматриваю таблицу, индекс прокручивается вместе с ней. Это также приводит к очень медленному освещению таблицы. Есть ли что-то очевидное, что я могу ошибаться? Я хочу, чтобы индекс оставался на месте справа, пока прокручивается таблица. Это код, я использую для заголовков индекса:iphone indexed table view problem

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

    return tempArray; 
} 

ответ

1

Я хотел бы избежать создания нового NSMutableArray и выпуская его каждый раз. Попробуйте создать их на viewDidLoad или конструкторе классов и просто ссылайтесь на предварительно построенный массив на sectionIndexTitesForTableView.

Если вы вообще не манипулируете массивом, вам, вероятно, не нужны накладные расходы NSMutableArray. Попробуйте переключить его на простой старый NSArray с помощью статического автозапуска конструктора arrayWithObjects.

Это должно ускорить процесс для вас.

+0

Благодарим за консультацию. У меня теперь есть это: - (NSArray *) sectionIndexTitlesForTableView: (UITableView *) tableView { \t NSArray * tempArray = [NSArray arrayWithObjects: @ "A", @ "B", @ "C", nil]; \t return tempArray; } Но это совсем не помогает (содержимое таблицы не обновляется до завершения прокрутки).Я думаю, что основная проблема заключается в том, что индекс прокручивается вместе с таблицей. Это явно неверно - он должен оставаться неподвижным, пока прокручиваются ячейки таблицы. Любая идея, почему это может произойти? – 2009-06-30 17:49:22

+0

Я не уверен, что означает «прокрутка индекса вместе со столом». Вы все равно создаете массив каждый раз, когда этот метод вызывается с этим кодом. – slf

+0

Если вы используете sectionIndexTitlesForTableView, убедитесь, что вы также используете tableView: sectionForSectionIndexTitle: atIndex: и tableView: numberOfRowsInSection: – slf

3

Вы действительно должны создавать индексный список где-то в другом месте (например, в методах инициализации или 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 и посмотреть, не имеет значения.

+0

Да, я подозревал, что создание массива каждый раз не было хорошей идеей и уже выполняло решение, подобное тому, которое вы предложил. Я просто возвращаю alphabetArray. Однако даже после этого индекс все еще прокручивается, а затем возвращается на место только после завершения прокрутки. Это озадачивает. Почему в мире прокручивается индекс? Нажатие или прокрутка по самому индексу прокручивает таблицу должным образом. Я попытался настроить myTableView.sectionIndexMinimumDisplayRowCount на несколько разных значений (3,10,20) - не имело никакого значения. – 2009-06-30 19:22:23

+0

Возможно, если вы попытаетесь установить его на количество элементов в alphabetIndex (т. Е. 27), он сохранит его на месте. Стоит попробовать. – Ramin

+0

В настоящее время таблица имеет менее 27 строк, поэтому установка ее на 27 приводит к тому, что индекс не отображается. Что означает, конечно, что таблица прокручивается и отображается отлично. Но все же, всякий раз, когда я показываю индекс, прокрутка таблицы не отображается до тех пор, пока прокрутка не остановится. – 2009-07-07 17:32:19

-1

Вы определенно не хотите создавать этот временный массив каждый раз , потому что он будет вызван много.

Почему этот метод «много называется»?

Не правда ли, мне просто нужно было построить этот индекс один раз ... и не будет ли sectionIndexTitlesForTableView вызываться только один раз?

(Если не изменить таблицу.)

+0

Нет, он вызывается каждый раз, когда отображается таблица времени, для каждого раздела в таблице. В том числе, когда пользователь прокручивается, и когда данные таблицы обновляются. – cleverbit

+0

Это не ответ. Если вы хотите обсудить существующий ответ, используйте комментарии. – KPM

1

Сделать статическую переменную, он будет выпущен на приложение выхода.

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