2011-09-13 2 views
17

Я пытаюсь создать UITableView индекс для быстрой прокрутки большого UITableView, у меня есть индекс, показывающий на права, но когда я пытаюсь прокрутить с ним, он не работает ..Сделать UITableView прокручивать по индексу

screenshot

Мне интересно, если я что-то пропустил, так что я интересно, если есть что-то еще, что я должен делать, или что-то вдоль этих линий.

#pragma - TableView Index Scrolling 

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView { 

    if(searching) 
     return nil; 

    NSMutableArray *tempArray = [[NSMutableArray alloc] init]; 
    [tempArray addObject:@"A"]; 
    [tempArray addObject:@"B"]; 
    [tempArray addObject:@"C"]; 
    [tempArray addObject:@"D"]; 
    [tempArray addObject:@"E"]; 
    [tempArray addObject:@"F"]; 
    [tempArray addObject:@"G"]; 
    [tempArray addObject:@"H"]; 
    [tempArray addObject:@"I"]; 
    [tempArray addObject:@"J"]; 
    [tempArray addObject:@"K"]; 
    [tempArray addObject:@"L"]; 
    [tempArray addObject:@"M"]; 
    [tempArray addObject:@"N"]; 
    [tempArray addObject:@"O"]; 
    [tempArray addObject:@"P"]; 
    [tempArray addObject:@"Q"]; 
    [tempArray addObject:@"R"]; 
    [tempArray addObject:@"S"]; 
    [tempArray addObject:@"T"]; 
    [tempArray addObject:@"U"]; 
    [tempArray addObject:@"V"]; 
    [tempArray addObject:@"W"]; 
    [tempArray addObject:@"Y"]; 
    [tempArray addObject:@"X"]; 
    [tempArray addObject:@"Z"]; 

    return tempArray; 
} 

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index { 

    if(searching) 
     return -1; 

    return index % 2; 
} 

ответ

10

Вид таблицы следует сгруппировать по алфавиту. Я считаю, что временный массив не знает, как перевести букву, выбранную вами в определенный индекс (он не знает, что такое «a», «b» или «c» означает).

Если вы посмотрите на список песен для ipod, вы заметите, что каждая группа букв имеет разделитель разделов букв. Вам нужно сгруппировать ваши табличные объекты в разделы с буквами, чтобы перевести букву «A» в индекс. Фактически, список ipod для яблока - это не прокрутка к первой записи «A», а начало раздела «A».

+0

хорошо, я думал, что, возможно, это был случай, спасибо за ваш ответ .. похоже, мне придется читайте, чтобы понять это. Если вы знаете какие-либо примеры в Интернете и имеете ссылку, я бы очень признателен. –

+0

А я вижу, что это то, что они, кажется, делают на этом шаге, я думаю. Http: //www.iphonesdkarticles.com/2009/01/uitableview-sectioned-table-view.html –

+0

Да, точно, вот и все. –

2

Вы можете попробовать:

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index { 
    return index; 
} 

Это трудно сказать, что это не так, без остальной части контроллера, но я думаю, что должно работать.

+1

нет этого не работает, к сожалению .. –

+0

Является ли ваш табличный вид сгруппированным или равным? –

+0

plain, thats, снятый с экрана в моем вопросе .. вы думаете, что это потому, что у меня одинаковые ценности? –

43

Вы можете использовать этот

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index 

Который говорит таблицу, в которой раздел соответствует секции заголовка/индекс (например, «В», 1))

Этот метод предназначен для возвращения в секцию, соответствующую Заглавие. Но вы хотите прокрутить строку одного раздела в соответствии с этими заголовками. поэтому следующие шаги:

  1. Создать глобальный массив означает объявить его в файле .h

    NSMutableArray *alphabetsArray; 
    NSMutableArray *dataArray; //--This contain your cell value i.e. Honda,Mazda--// 
    
  2. Определить его в viewDidLoad метод, как показано ниже, то вернуть его из метода UITableView ..

    alphabetsArray = [[NSMutableArray alloc] init]; 
    [alphabetsArray addObject:@"A"]; 
    [alphabetsArray addObject:@"B"]; 
    [alphabetsArray addObject:@"C"]; 
    [alphabetsArray addObject:@"D"]; 
    [alphabetsArray addObject:@"E"]; 
    [alphabetsArray addObject:@"F"]; 
    [alphabetsArray addObject:@"G"]; 
    [alphabetsArray addObject:@"H"]; 
    [alphabetsArray addObject:@"I"]; 
    [alphabetsArray addObject:@"J"]; 
    [alphabetsArray addObject:@"K"]; 
    [alphabetsArray addObject:@"L"]; 
    [alphabetsArray addObject:@"M"]; 
    [alphabetsArray addObject:@"N"]; 
    [alphabetsArray addObject:@"O"]; 
    [alphabetsArray addObject:@"P"]; 
    [alphabetsArray addObject:@"Q"]; 
    [alphabetsArray addObject:@"R"]; 
    [alphabetsArray addObject:@"S"]; 
    [alphabetsArray addObject:@"T"]; 
    [alphabetsArray addObject:@"U"]; 
    [alphabetsArray addObject:@"V"]; 
    [alphabetsArray addObject:@"W"]; 
    [alphabetsArray addObject:@"Y"]; 
    [alphabetsArray addObject:@"X"]; 
    [alphabetsArray addObject:@"Z"]; 
    

    [Примечание: Вы можете al поэтому создайте alphabetsArray с динамическим содержит в соответствии с вашим dataArray.Для этого следует Как мы можем создавать динамические заголовки индекса секции массива при температуре ниже]

  3. Теперь использовать вышеупомянутый метод, чтобы получить титул

    - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView { 
        return alphabetsArray; 
    } 
    
  4. Написать вашу логику для прокрутки в UITableView

    - (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index { 
        for (int i = 0; i< [dataArray count]; i++) { 
         // Here you return the name i.e. Honda,Mazda 
         // and match the title for first letter of name 
         // and move to that row corresponding to that indexpath as below 
         NSString *letterString = [[dataArray objectAtIndex:i] substringToIndex:1]; 
         if ([letterString isEqualToString:title]) { 
          [tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES]; 
          break; 
         } 
        } 
        return -1; 
    } 
    

**** Как можно создавать динамические заголовки индекса раздел массива ****

  1. Предположим, что DataArray как то

    [@"Honda",@"Maruti",@"Mazda",@"Toyota",.....] 
    
  2. Создание метода для создания динамического раздела индекса названия массив, как показано ниже

    - (void)createAlphabetArray; 
    
  3. Implements createAlphabetArray метод, как показано ниже

    #pragma mark - Create Alphabet Array 
    - (void)createAlphabetArray { 
        NSMutableArray *tempFirstLetterArray = [[NSMutableArray alloc] init]; 
        for (int i = 0; i < [dataArray count]; i++) { 
         NSString *letterString = [[dataArray objectAtIndex:i] substringToIndex:1]; 
         if (![tempFirstLetterArray containsObject:letterString]) { 
          [tempFirstLetterArray addObject:letterString]; 
         } 
        } 
        alphabetsArray = tempFirstLetterArray; 
        [tempFirstLetterArray release]; 
    } 
    
  4. Теперь просто называют его в любом месте, если вы хотите изменить alphabetsArray содержит

    [self createAlphabetArray]; 
    

Теперь вы можете создавать динамические заголовки индекса раздела массив динамически в соответствии с вашими содержимым DataArray.

+0

Удивительно ... вы сделали все так ясно, что мне больше не нужно изучать какие-либо учебники ... Спасибо :) – NightFury

+0

Спасибо для ваших комментариев –

+0

Очень хорошее объяснение, решена моя проблема. Спасибо. –

Смежные вопросы