Проблема прокрутки UITableView - PullRequest
       15

Проблема прокрутки UITableView

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

У меня есть TableView с пользовательскими ячейками, в некоторых из которых есть изображения, а в других нет.Все работает нормально, но когда я начинаю прокручивать, ячейки не отображаются правильно (изображения помещаются в «неправильные» ячейки и обрезаются посередине).Кто-нибудь сейчас как это исправить?

Ответы [ 3 ]

4 голосов
/ 20 сентября 2011

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

В методе cellForRowAtIndexPath вы возвращаете ячейку.Либо существующая ячейка с использованием метода dequeue, либо вы создаете новую.В этой ячейке вы устанавливаете все свойства того, что вы хотите представить.

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

Итак, вам нужен отдельный индекс, такой как NSArray для поддержки объектов вашей модели.Этот объект модели содержит все детали изображения и т. Д.

Давайте рассмотрим пример.У меня есть массив с 10 объектами, первые пять из которых являются image "a.png", а вторые пять "b.png".

Если я получаю обратный вызов cellForRowAtIndexPath, я хочу сделать следующим образом:

cellForRowAtIndexPath: (0,0) предоставить объекту из массива индекс 0, который является a.png cellForRowAtIndexPath: (0,1) предоставить объекту из массива индекс 1, который является a.pngcellForRowAtIndexPath: (0,2) предоставляет объект из массива с индексом 2, который является a.png cellForRowAtIndexPath: (0,3) предоставляет объект из массива с индексом 3, а a.png cellForRowAtIndexPath: (0,4) предоставляет объект измассив с индексом 4, который представляет собой a.png cellForRowAtIndexPath: (0,5) предоставляет объект из массива с индексом 5, который является b.png cellForRowAtIndexPath: (0,6) предоставляет объект из массива с индексом 6, который является b.pngcellForRowAtIndexPath: (0,7) предоставляет объект из массива с индексом 7, который является b.png cellForRowAtIndexPath: (0,8) предоставляет объект из массива с индексом 8, а b.png cellForRowAtIndexPath: (0,9) предоставляет объект измассив индекс 9, которыйis b.png

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

Для каждого вышеуказанного вызова происходит следующее:

cellForRowAtIndexPath: (0,1) предоставляет объекту из массива индекс 1, который является a.png - вы пытаетесь удалить из очередисуществующая ячейка, но она возвращается "ноль", поэтому вы создаете новую ячейку.Вы устанавливаете детали вашего объекта модели.

cellForRowAtIndexPath: (0,2) предоставляет объекту из массива индекс 2, который является a.png - вы пытаетесь удалить из очереди существующую ячейку, но она возвращается "nil"«Итак, вы создаете новую ячейку.Вы устанавливаете детали вашего объекта модели.

cellForRowAtIndexPath: (0,3) предоставляет объекту из массива индекс 3, который является a.png - вы пытаетесь удалить из очереди существующую ячейку, но она возвращается "nil"«Итак, вы создаете новую ячейку.Вы устанавливаете детали вашего объекта модели.

cellForRowAtIndexPath: (0,4) предоставляет объекту из массива индекс 4, который является a.png - вы пытаетесь удалить из очереди существующую ячейку, но она возвращается "ноль"«Итак, вы создаете новую ячейку.Вы устанавливаете детали вашего объекта модели.

cellForRowAtIndexPath: (0,5) предоставляет объекту из массива индекс 5, который является b.png - вы пытаетесь удалить из очереди существующую ячейку, и она работает!Вы можете использовать эту ячейку снова, установив детали объекта вашей модели

cellForRowAtIndexPath: (0,6) предоставить объект из массива с индексом 6, который является b.png - вы пытаетесь удалить из очереди существующую ячейку ионо работает!Вы можете использовать эту ячейку снова, установив детали объекта вашей модели

cellForRowAtIndexPath: (0,7) предоставить объект из массива с индексом 7, который является b.png - вы пытаетесь удалить из очереди существующую ячейку ионо работает!Вы можете использовать эту ячейку снова, установив детали объекта вашей модели

cellForRowAtIndexPath: (0,8) предоставить объект из массива с индексом 8, который является b.png - вы пытаетесь удалить из очереди существующую ячейку ионо работает!Вы можете использовать эту ячейку снова, установив детали вашего объекта модели

cellForRowAtIndexPath: (0,9) предоставить объект из массива с индексом 9, который является b.png- вы пытаетесь удалить существующую ячейку из очереди, и она работает!Вы можете использовать эту ячейку снова, установив детали вашего модельного объекта

Извините, что вы так многословны!Надеюсь, это поможет.Может быть, стоит поработать над хорошим руководством по просмотру таблицТам наверняка будет много.

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

Попробуйте изменить значение идентификатора для вашей ячейки.

NSString* identifierStr = [NSString stringWithFormat:@"ident_%d",indexPath.row];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifierStr];
0 голосов
/ 20 сентября 2011

Вы, вероятно, добавляете изображения при создании экземпляров ячеек, а не когда представление таблицы запрашивает представление ячеек.Пример:

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ident"];
    UIImageView *imageView;
    if (cell == nil) {
        cell = [UITableViewCell alloc] init ....];
        imageView = [[UIIMageView alloc] init];
        imageView.tag = 123;
        [cell addSubview:imageView];
        [imageView release];
    } else {
        imageView = [cell viewWithTag:123];
    }

    imageView.image = ...; // load image here
}

Это неправильный путь.Мы устанавливаем изображение при создании ячейки.Это приведет к тому, что ячейки будут иметь неправильные изображения при повторном использовании.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ident"];
    if (cell == nil) {
        cell = [UITableViewCell alloc] init ....];
        UIImageView *imageView = [[UIIMageView alloc] init];
        imageView.image = ...; 
        [cell addSubview:imageView];
        [imageView release];
    }

}
...