Сделать UITableView прокручиваемым по индексу

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

скриншот

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

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

person C.Johns    schedule 13.09.2011    source источник


Ответы (3)


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

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

person Daniel G. Wilson    schedule 13.09.2011
comment
хорошо, я думал, что это могло быть так, спасибо за ваш ответ ... похоже, мне придется прочитать, чтобы понять это. Если вы знаете какие-либо примеры в Интернете и имеете ссылку, я был бы очень признателен. - person C.Johns; 14.09.2011
comment
А, я вижу, это то, что они, кажется, делают на этом этапе, я думаю. noreferrer">iphonesdkarticles.com/2009/01/ - person C.Johns; 14.09.2011

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

- (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. #P5#
    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"];
    
    <цитата> #P6#
  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. Теперь просто вызовите его в любом месте, когда вы хотите изменить алфавиты. Массив содержит

    [self createAlphabetArray]; 
    

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

person Lalit Kumar Maurya    schedule 31.08.2012
comment
Потрясающе... вы сделали все так ясно, что мне больше не нужно заглядывать в какой-либо учебник... Спасибо :) - person NightFury; 22.04.2013
comment
Эй, спасибо за ответ. Оно работает! Но просто интересно, какое целое число вы, ребята, возвращаете методом - (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index ? Я только что вернул случайное число, например. 100, а правый индекс просто работает (прокручивается). Таким образом, номер индекса, возвращаемый этим методом, не имеет большого значения? - person nluo; 10.11.2013
comment
@ nick32m Это не имеет значения, потому что здесь у нас есть только один раздел, в котором мы прокручиваем и используем массив алфавитов, как список разделов. - person Lalit Kumar Maurya; 15.11.2013
comment
@LalitKumar - На самом деле, это имеет значение в том смысле, что если вы вернете там действительный индекс раздела, то UITableView попытается прокрутить сам себя, тем самым сводя на нет попытку прокрутки вручную. Необходимо вернуть из этой функции значение, не соответствующее действительному индексу раздела (или вообще ничего не возвращать). Я полагаю, что NSNotFound является разумным возвращаемым значением для использования в этом случае. - person aroth; 16.12.2013
comment
@aroth - вы правы, возвращая значение (например, 0) из вышеуказанного метода, потому что он требует этого метода. Но вы должны определить свой собственный метод прокрутки, потому что у вас есть только один раздел, в котором вы хотите прокручивать на основе заголовка индекса раздела. - person Lalit Kumar Maurya; 16.12.2013
comment
@Lalit - большое спасибо за отличную идею использовать ручную прокрутку внутри метода sectionForSectionIndexTitle! Отличный подход в таких случаях, как мой, когда я уже сгруппировал строки по имени другого раздела! - person Mykola Denysyuk; 11.03.2014
comment
return 0 у меня не работал, поэтому я добавил return 1; который отлично работает сейчас. - person Prasen; 24.04.2014
comment
Чтобы прояснить все вышесказанное, вам нужно вернуть несуществующий порядковый номер из sectionForSectionIndexTitle. Если вы вернете 0 (или какое-либо другое значение раздела, которое существует), представление будет прокручиваться до этого раздела, а не до вашего выбора. - person davidjb; 31.05.2015
comment
@Lalit Kumar: Пожалуйста, измените свой код, чтобы отразить то, что говорит davidjb. Если вы вернете -1, это сработает. Если вы вернете 0, это не сработает. (мне потребовалось некоторое время, прежде чем я увидел комментарий выше и исправил его!) - person Gik; 19.12.2015

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

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

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

person Evan Cordell    schedule 13.09.2011
comment
Ваше табличное представление сгруппировано или просто? - person Evan Cordell; 14.09.2011
comment
просто, это снимок экрана в моем вопросе .. вы думаете, это потому, что у меня одинаковые значения? - person C.Johns; 14.09.2011
comment
Он должен быть сгруппирован так, чтобы вызывались методы раздела. - person Evan Cordell; 14.09.2011
comment
спасибо, я изучаю это сейчас :) спасибо за вашу помощь, как только у меня будет решение, я обновлю свой пост - person C.Johns; 14.09.2011