UITableView помечает ячейки случайным образом, когда они покидают фрейм - PullRequest
1 голос
/ 13 октября 2011

У меня есть UITableView, в котором вы можете отметить только 4 ячейки.Если я отмечу определенное количество ячеек, а затем прокручиваю вверх или вниз, это помечает случайные ячейки.Я не понимаю логику, стоящую за этим, потому что единственный метод, который я использую для пометки, - это DidSelectRowAtIndex, который не выполняется (я поставил точку останова, чтобы проверить это).Я действительно не знаю, что может быть причиной этого, но вот cellForRowAtIndex:

- (UITableViewCell *) tableView: (UITableView *) tableView
          cellForRowAtIndexPath: (NSIndexPath *) indexPath
{

        static NSString *cellName = @"PrefsTableViewCell";

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:
                                 cellName];
        if (cell == nil)
        {
                cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellName] autorelease];
        }

        NSUInteger row = [indexPath row];
        Drink *drink = [drinks objectAtIndex:row];

        cell.textLabel.text = drink.name;
        cell.detailTextLabel.text = [NSString stringWithFormat:@"%d", drink.caffeine];
        [[cell imageView] setImage:drink.image];

        return cell;
}

У меня такое ощущение, что это как-то связано с этим, но я не могу точно сказать.

Вот как это выглядит до прокрутки:

enter image description here

Вот что происходит, когда я прокручиваю вверх:

enter image description here

Я не щелкнул по этому верхнему.Если я прокручиваю вниз и снова вверх, это, вероятно, будет снято, а другое будет отмечено.

Это может быть важно, так что вот метод didSelectRowAtIndexPath:

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
        UITableViewCell *cell = [tableView cellForRowAtIndexPath: indexPath];

        NSLog(@"TESTING");

        if ((cell.accessoryType == UITableViewCellAccessoryNone) && [[DataContainerSingleton theDataContainerSingleton].favourites count] < 4)
        {
                cell.accessoryType = UITableViewCellAccessoryCheckmark;

                [[DataContainerSingleton theDataContainerSingleton].favourites addObject:[drinks objectAtIndex:indexPath.row]];
                NSLog(@"CHECKED %d", [[DataContainerSingleton theDataContainerSingleton].favourites count]);
        }
        else if (cell.accessoryType == UITableViewCellAccessoryCheckmark)
        {
            for (int i = 0; i < [[DataContainerSingleton theDataContainerSingleton].favourites count]; i++)
            {
                NSString *drinkName = [[drinks objectAtIndex:indexPath.row] name];
                NSString *favName = [[[DataContainerSingleton theDataContainerSingleton].favourites objectAtIndex:i] name];

                if ([drinkName isEqualToString: favName])
                {
                    cell.accessoryType = UITableViewCellAccessoryNone;
                    [[DataContainerSingleton theDataContainerSingleton].favourites removeObjectAtIndex:i];
                    NSLog(@"UNCHECKED %d", [[DataContainerSingleton theDataContainerSingleton].favourites count]);
                }
            }

        }
}

1 Ответ

4 голосов
/ 13 октября 2011

Вы не сохраняете, какие пункты отмечены галочкой.Вы должны сохранить индексы в массиве и установить галочку в cellForRowAtIndexPath:.Что-то вроде -

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

        if(![self.tickedIndexPaths containsObject:indexPath]) //tickedIndexPaths is an array
            [self.tickedIndexPaths addObject:indexPath];
        else
            [self.tickedIndexPaths removeObject:indexPath];
}

Затем -

- (UITableViewCell *) tableView: (UITableView *) tableView
          cellForRowAtIndexPath: (NSIndexPath *) indexPath
{

        static NSString *cellName = @"PrefsTableViewCell";

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:
                                 cellName];
        if (cell == nil)
        {
                cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellName] autorelease];
        }

        NSUInteger row = [indexPath row];
        Drink *drink = [drinks objectAtIndex:row];

        cell.textLabel.text = drink.name;
        cell.detailTextLabel.text = [NSString stringWithFormat:@"%d", drink.caffeine];
        [[cell imageView] setImage:drink.image];

        if([self.tickedIndexPaths containsObject:indexPath])
        {
              cell.accessoryType = UITableViewCellAccessoryCheckmark;
        }
        else
        {
              cell.accessoryType = UITableViewCellAccessoryNone;
        }

        return cell;
}

Имейте в виду, что из-за повторного использования ячеек последний блок еще очень важен.

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