2016-09-26 3 views
0

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

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    myTableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 

    if (![selectedDX containsObject:myMutArray[indexPath.row]]) 
    { 
     [selectedDX addObject:myMutArray[indexPath.row]]; 
     cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    } 

} 
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath { 

    myTableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 

    if ([selectedDX containsObject:myMutArray[indexPath.row]]) { 
     [selectedDX removeObject:myMutArray[indexPath.row]]; 
     cell.accessoryType = UITableViewCellAccessoryNone; 
    } 
} 

Я также попытался его в одном методе didSelectRowAtIndexPath, но результат тот же.

+0

allCodeLabel это тип массива строк? –

ответ

2

Добавить условие cellForRowAtIndexPath

if([selectedDX containsObject:allCodeLabel[indexPath.row]]) 
    { 
     cell.accessoryType = UITableViewCellAccessoryType.Checkmark 
    } 
    else 
    { 
     cell.accessoryType = UITableViewCellAccessoryType.None 
    } 

Он работает для меня. Надеюсь, это поможет :)

+0

@SimonMcLoughlin Если вы используете код из моего вопроса, а также реализуете его в файле didSelectRowAtIndexPath. Он работает отлично. Все три ответа верны. –

+0

Я знаю, что это проблема повторного использования ячеек, но для больших массивов вместо использования различного идентификатора ячейки и влияния на память это кажется проще. – sanman

+0

@ TalhaCh извинения Я не прочитал этот ответ, я думал, что он был тем же и один ниже. Это верно. Один из других ответов, предлагающих только код внутри 'didSelectRowAtIndexPath', неверен –

3

Правильно ли вы устанавливаете тип аксессуара, когда вы возвращаете ячейку в cellForRowAtIndexPath? Мне кажется, что вы устанавливаете аксессуар только тогда, когда пользователь нажимает на ячейку, но этого недостаточно.

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

    [...] 

    if ([selectedDX containsObject:myMutArray[indexPath.row]]) 
    { 
     cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    } 
    else 
    { 
     cell.accessoryType = UITableViewCellAccessoryNone; 
    } 

    [...] 
} 

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

Вы также можете сбросить аксессуаром в методе prepareForReuse в обычае UITableViewCell подкласс

+0

Я понимаю, и это кажется правильным путем. вы можете показать в коде, пожалуйста, –

1

вы можете справиться с этим, как это:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    WCategoriesTableViewCell* cell = [tableView 
           cellForRowAtIndexPath:indexPath]; 

    if (cell.accessoryType == UITableViewCellAccessoryNone) 
    cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    else 
    cell.accessoryType = UITableViewCellAccessoryNone; 
} 
+1

Это не решит проблему, проблема в повторном использовании ячеек. Устанавливать его через 'didSelectRowAtIndexPath' недостаточно –

+0

@SimonMcLoughlin это может и достаточно bro :) – Mohamad

+0

Его нет, проблема возникает, когда ячейка повторно используется внутри' cellForRowAtIndexPath'. Поскольку пользователь прокручивает вверх и вниз, повторное использование экземпляра и позиция теряется. Добавление этого дополнительного кода, когда пользователь удаляет ячейку, не будет иметь никакого эффекта, пока экран прокручивается. –

Смежные вопросы