2012-04-25 4 views
0

Я хочу, чтобы Checkmark, в частности, TableView Cell.Контрольная точка в ячейке UITableView

Так я использовал код:

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

newRow = [indexPath row]; 
oldRow = [lastIndexPath row]; 

if (newRow != oldRow) { 
    UITableViewCell *newCell = [tableView cellForRowAtIndexPath:indexPath]; 
    newCell.accessoryType = UITableViewCellAccessoryCheckmark; 

    UITableViewCell *oldCell = [tableView cellForRowAtIndexPath: lastIndexPath]; 
    oldCell.accessoryType = UITableViewCellAccessoryNone; 

    lastIndexPath = indexPath; 
} 
else{ 
    UITableViewCell *newCell = [tableView cellForRowAtIndexPath:indexPath]; 
    newCell.accessoryType = UITableViewCellAccessoryCheckmark; 
    lastIndexPath = indexPath; 
}} 

Its работает в iPhone Simulator штрафа. Но при тестировании на устройстве iPhone он сбрасывает приложение.

Любое решение для этого ..?

Заранее спасибо.

+0

Какое сообщение об ошибке аварии? – lnafziger

+0

EXE_BAD_ACCESS для oldRow = [lastIndexPath row]; –

ответ

2

Наиболее вероятной причиной вашей аварии в вашем Ивар, lastIndexPath. Вы сохраняете значения в этом, не сохраняя их, поэтому они могут быть выпущены в любое время. Попробуйте определить свойство с именем lastIndexPath (retain для подсчета ссылок вручную, strong для автоматического подсчета ссылок). Затем вы можете использовать self.lastIndexPath = indexPath или [self setLastIndexPath:indexPath].

Кроме того, это плохо, чтобы принудительно изменить содержимое ячейки, как это. Лучше сохранить выбранный индекс, а затем перезагрузить данные таблицы. Для максимальной эффективности обновляйте только измененные ячейки. Включите и выключите ваш метод cellForRowAtIndexPath:.

+0

Спасибо. Я использовал, как вы и предполагали. Я создал свойство lastIndexPath (NSIndexPath) и синтезировал его .. И его работа в симуляторе прекрасна. Но все еще проблема в устройстве iPhone. –

+1

Вы полностью используете свое новое свойство? Вы заменили 'oldRow = [lastIndexPath row];' с 'oldRow = [[self lastIndexPath] row];' и оба случая 'lastIndexPath = indexPath;' с '[self setLastIndexPath: indexPath];'? – Dondragmer

+0

Да .. попробовал .. Он бросает SIGABRT .. –

0

Просто напишите следующий код в методе cellForRowAtIndexPath.

[[cell imageView] setImage:[UIImage imageNamed:@"tickmarkBlue.png"]]; 
[[cell imageView] setHidden:YES]; 

if(<your condition here>) 
{ 
     [[cell imageView] setHidden:NO]; 
} 
+0

Применение изменений в 'cellForRowAtIndexPath:' является правильным. Тем не менее, это напрямую не касается проблемы с исходным поломком плаката. Кроме того, был ли этот код написан для некоторой задачи, для которой '[cellAtteryType: UITableViewCellAccessoryCheckmark]' не подходит? – Dondragmer

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