2010-05-22 3 views
3

Я пытаюсь добавить галочки в элементы, когда пользователь выбирает строки в виде таблицы. Однако, мнение не обновляется и галочки не делают никаких Обнаруживаются:Вид аксессуара в UITableView: просмотр не обновляется

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

    UITableViewCell* oldCell = [self tableView:tv cellForRowAtIndexPath:[NSIndexPath indexPathForRow:selectedIndex inSection:0]]; 
    oldCell.accessoryType = UITableViewCellAccessoryNone; 

    if (indexPath.section == 0) { 
     selectedIndex = indexPath.row; 
    } 

    UITableViewCell* newCell = [self tableView:tv cellForRowAtIndexPath:indexPath]; 
    newCell.accessoryType = UITableViewCellAccessoryCheckmark; 

    [tv deselectRowAtIndexPath:indexPath animated:NO]; 
} 

Что может быть причиной этого?

ответ

6

Вызов cellForRowAtIndexPath непосредственно на объекте телевизора, а не через себя, чтобы убедиться, что вы получите надлежащую ссылку на ячейку обратно:

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

    UITableViewCell *oldCell = [tv cellForRowAtIndexPath:[NSIndexPath indexPathForRow:selectedIndex inSection:0]]; 
    oldCell.accessoryType = UITableViewCellAccessoryNone; 

    if (indexPath.section == 0) { 
     selectedIndex = indexPath.row; 
    } 

    UITableViewCell *newCell = [tv cellForRowAtIndexPath:indexPath]; 
    newCell.accessoryType = UITableViewCellAccessoryCheckmark; 

    [tv deselectRowAtIndexPath:indexPath animated:NO]; 
} 

Также убедитесь, что в cellForRowAtIndexPath, у вас есть эта логика:

... 
if (indexPath.row == selectedIndex) 
    cell.accessoryType = UITableViewCellAccessoryCheckmark; 
else 
    cell.accessoryType = UITableViewCellAccessoryNone; 
... 
return cell; 

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

+0

Согласен и из того, что я вижу ВСЕ код в файле didSelectRowAtIndexPath, должен идти, сохраняя deselectRowAtIndexPath. Что произойдет, когда выбрана строка, вызовите [tv reloadData]; и пусть cellForRowAtIndexPath делает все это. – gnasher

+1

Вызов reloadData каждый раз, когда вы проверяете или снимаете флажок, это плохая идея, если вы можете так же легко установить галочку вручную, не воссоздавая каждую видимую ячейку. –

+0

Насколько отличается вызов cellForRowAtIndexPath прямо на телевизоре или то, как я это делал? В любом случае, он решил мою проблему, поэтому спасибо. – Kamchatka

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