UITableView, встроенный в повторное использование ячеек UIContainerView

У меня есть UITableViewController с включенной прокруткой, встроенный в UIContainerView. В табличном представлении есть пользовательский UITableViewCell, в котором есть UIImageView внутри, когда вы выбираете одну из нескольких ячеек в табличном представлении, я получаю индексный путь и устанавливаю представление изображения выбранной ячейки для отображения галочки. Табличное представление динамически заполняется несколькими фрагментами данных из массива. Простой.

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

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

Как это исправить? (Код приведен ниже)

    - (void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    CuisineTableCell *cell  = [tableView cellForRowAtIndexPath:indexPath];
    //Store current view in defaults
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    if (cuisineSelected == NO) {
        cuisineSelected = YES;
        cell.imageView.image = [UIImage imageNamed:@"TickedCircle"];
        //Set cuisine one defaults
        [defaults setObject:[cuisinesArray objectAtIndex:indexPath.row] forKey:@"filterCuisineString"];
        [defaults synchronize];
        selectedRow = [tableView indexPathForSelectedRow];
    }
    else if(indexPath.row == selectedRow.row) {
        cuisineSelected = NO;
        cell.imageView.image = [UIImage imageNamed:@"UntickedCircle"];
        //Set cuisine one defaults
        [defaults setObject:@"" forKey:@"filterCuisineString"];
        [defaults synchronize];
        selectedRow = NULL;
    }
    else {
        CuisineTableCell *selectedCell  = [tableView cellForRowAtIndexPath:selectedRow];
        selectedCell.imageView.image = [UIImage imageNamed:@"UntickedCircle"];
        // the one and only cell in the section
        cuisineSelected = YES;
        cell.imageView.image = [UIImage imageNamed:@"TickedCircle"];
        //Set cuisine one defaults
        [defaults setObject:[cuisinesArray objectAtIndex:indexPath.row] forKey:@"filterCuisineString"];
        [defaults synchronize];
        selectedRow = [tableView indexPathForSelectedRow];
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"filterCuisineCell";
    CuisineTableCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cuisineSelected == NO) {
        cell.imageView.image = [UIImage imageNamed:@"UntickedCircle"];
    }
    cell.textLabel.text = [cuisinesArray objectAtIndex:indexPath.row];

    return cell;
}

person Alex Saidani    schedule 12.03.2014    source источник
comment
Можете ли вы показать свою функцию cellForRowAtindexPath?   -  person Merlevede    schedule 12.03.2014
comment
Привет, только что добавил в описание.   -  person Alex Saidani    schedule 12.03.2014


Ответы (1)


Поскольку ячейка повторно использует ВСЕ части, если ее необходимо установить или отменить, если она повторно использует ячейку и стоит галочка, она снова отобразится. Обратите внимание, что если у вас есть 20 строк, но только 4 на экране, iOS будет рисовать только несколько из них, и по мере того, как одна прокрутка будет повторно использоваться для следующей.

Большая часть вашего didSelect.... не нужна.

Изменить на это;

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"filterCuisineCell";
    CuisineTableCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (indexPath.row == selectedRow.row) {  // if you have sections then compare the whole indexPath
        cell.imageView.image = [UIImage imageNamed:@"TickedCircle"];
    }
    else
    {
        cell.imageView.image = [UIImage imageNamed:@"UntickedCircle"];
    }
    cell.textLabel.text = [cuisinesArray objectAtIndex:indexPath.row];

    return cell;
}
person Recycled Steel    schedule 12.03.2014