2014-09-09 6 views
0

У меня есть приложение с некоторыми сообщениями, размещенными в UITableView. У каждого сообщения есть любимая кнопка, и мне нужно изменить ее изображение, когда пользователь нажимает на него. Вот код:Наличие конфликтов при обновлении образа UIButton в UITableViewCell в iOS

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
static NSString *identifier = @"identifier"; 

CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:identifier]; 

if(cell == nil){ 
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"myNib" owner:self options:nil]; 
    cell = [nib objectAtIndex:0]; 
} 

NSDictionary *post = [posts objectAtIndex:indexPath.row]; 

[cell.likeButton addTarget:self 
       action:@selector(clickedOnLike:) 
     forControlEvents:UIControlEventTouchUpInside]; 
cell.likeButton.tag = indexPath.row; 

И обработчик щелчка:

-(IBAction)clickedOnLike:(id)sender 
{ 

int tag = buttonSender.tag; 
NSDictionary *post = [posts objectAtIndex:tag]; 

if(![self likedAlready:post]){ 

    //set liked on this view... 

    //update view 
    NSLog(@"button: %@",buttonSender); 
    [sender setImage:[UIImage imageNamed:@"newImage.png"] forState:UIControlStateNormal]; 

    //send like to server... 
    } 
} 

На данный момент, все будет в порядке. Проблема заключается в том, что после нажатия кнопки обновить представление и прокрутить список до других ячеек, другие просмотры кнопок, которые я никогда не нажал, также обновляются. Например, когда я нажимаю кнопку в indexPath 1, те, которые на 5 и 9 автоматически меняют изображения. Это mistery для меня, так как я вызываю отправителя действия напрямую и обновляю только его. Спасибо за помощь.

+0

Поскольку ячейки повторно используются, вызовы «addTarget» остаются неподвижными, я думаю (вероятно, они укладываются в стек). Возможно, вам нужно удалить действия для контрольных событий в начале cellForRowAtIndexPath: – EDUsta

ответ

1

Многоразовая ячейка: dequeueReusableCellWithIdentifier.

U необходимо иметь дело с такими вещами.

U может вызвать вручную в ваш метод clickedOnLike: из CellForRowAtIndexPath:

Try поддерживать внутри модального (от вашей архитектуры разработки MVC), и доступ туда из CellForRowAtIndexPath:

Это позволит решить вашу проблему :)

Удачи!

1

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

1

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

С другой стороны, если у вас есть очень небольшое количество сообщений, просто ликвидировать рециркуляцию, делая

статического NSString * идентификатор = ноль;

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