Сделать UITableView прокручиваемым по индексу - PullRequest
17 голосов
/ 14 сентября 2011

Я пытаюсь создать индекс 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;
}

Ответы [ 3 ]

43 голосов
/ 31 августа 2012

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

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

которая сообщает таблице, какой раздел соответствует заголовку / индексу раздела (например, "B", 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"];
    

    [ Примечание: Вы также можете создать 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. Реализует 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.

10 голосов
/ 14 сентября 2011

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

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

2 голосов
/ 14 сентября 2011

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

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

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

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