2013-05-28 3 views
1

В моем приложении я столкнулся с действительно странной проблемой. Я пытаюсь решить это часами, но пока не могу найти, в чем проблема.iphone development: изменение изображения кнопки на tableviewcell

Ну, у меня есть табличное представление с пользовательскими ячейками. и у каждой ячейки есть кнопка. Это похоже на пустую коробку. Когда кнопка нажата, я хочу изменить связанное изображение ячейки этой кнопки. На самом деле я успешно это делаю, но каким-то образом изображения кнопок других ячеек также меняются, и я не мог понять, почему. Вот мой код:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     static NSString *CellIdentifier = @"cell"; 
     CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
     if (cell == nil) 
     { 
      //create new cell 
      cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
     } 
     [cell.tickButton setTag:indexPath.row]; 
     [cell.tickButton addTarget:self action:@selector(buttonWasPressed:)forControlEvents:UIControlEventTouchUpInside]; 

//cell has 2 label so I filled them with the contents of my object array that part is working with no problem 
     cell.leftLabel.text = [NSString stringWithFormat:@"%@", [[contacts objectAtIndex:indexPath.row]name]]; 
     cell.rightLabel.text = [NSString stringWithFormat:@"%@", [[contacts objectAtIndex:indexPath.row]email]]; 

     return cell; 
    } 

в моем buttonWasPressed методе я просто сделать:

-(IBAction)buttonWasPressed:(id)sender 
{ 
    UIButton *button = (UIButton *)sender; 
    [button setImage:[UIImage imageNamed:@"ticck.jpeg"] forState:UIControlStateNormal]; 

} 

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

ответ

1

Проблема вызова

[cell.tickButton addTarget:self action:@selector(buttonWasPressed:)forControlEvents:UIControlEventTouchUpInside]; 

метод.

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

Просто добавьте метод addTarget в предложение if.

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

Лучший способ сделать это: вы добавляете свойство к контактному объекту, который предварительно задан в ячейках и задает значение при запуске метода действия. Затем в методе cellForRowAtIndexPath: вы можете установить изображение кнопки, установив это свойство.

+0

Хороший ответ. Я новая пчела. я бы хотел вставить фрагмент кода. Это будет полезно. благодаря –

1

ли это

NSString *CellIdentifier = [NSString stringWithFormat:@"cell%d",indexPath.row]; 
+0

Таким образом, ячейка не будет использоваться повторно, и если в представлении таблицы загрузится много данных (изображений и других материалов), будут проблемы с памятью и производительностью. – danypata

+0

@ Durgaprasad, но это не сработало ... когда я использую его вместо 'static NSString * CellIdentifier = @ "cell";' эта строка у меня пустой табличный вид:/ – death7eater

+0

Этого не может быть. Используя эту строку, вы не будете повторно использовать ячейки. Он работает в таких условиях. – Durgaprasad

6

Вы можете получить доступ к этой ячейке и может изменить изображение кнопки как:

-(IBAction)buttonWasPressed:(id)sender 
{ 

    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:your_row inSection:your_section]; 
    UITableViewCell *currentCell = [table cellForRowAtIndexPath:indexPath]; 
    UIButton *button = (UIButton *)[currentCell viewWithTag:(UIButton *)sender.tag]; 
    [button setImage:[UIImage imageNamed:@"ticck.jpeg"] forState:UIControlStateNormal]; 
} 

Надеется, что это помогает.

0

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

[cell.tickButton setImage:nil forState:UIControlStateNormal]; 

Прежде чем назначать что-либо своей ячейке.

0

Вы должны сохранить метку кнопки, которая была нажата, чем попробовать этот

if(pressed[cell.tickButton.tag]) 
    [button setImage:[UIImage imageNamed:@"ticck.jpeg"] forState:UIControlStateNormal]; 
else 
    [cell.tickButton setImage:nil forState:UIControlStateNormal]; 
0

Я думаю, вы даете изображение по умолчанию кнопки внутри класса CustomCell. Эта проблема очень распространена в UITableviews.

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

Например:

обновление код внутри метода cellForRowAtIndexPath

if (cell == nil) 
    { 
     //create new cell 
     cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 

, если (yourCondition == ДА) {

change the button image to the special image. 

} еще {

keep the button image as default image. 

}

возврата клеток;

Чтобы отслеживать ячейки, вы можете сохранить путь указателя к ячейкам (кнопка нажата) в массиве.Внутри проверки cellForRowAtIndexPath если текущий indexPath присутствует в массиве или нет

1

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

[button setImage:[UIImage imageNamed:@"ticck.jpeg"] forState:UIControlStateSelected]; 

В вашем методе действия кнопки это сделать:

-(IBAction)buttonWasPressed:(id)sender 
{ 
    UIButton *button = (UIButton *)sender; 
    if(button.selected==NO) { 
    [button setSelected:YES]; 

    } 

} 

Надеюсь, это поможет.

3

Вы можете иметь дело с сенсорным интерфейсом в пределах класса CustomCell. Просто переместите метод -(IBAction)buttonWasPressed:(id)sender в свой собственный класс и добавьте tickButton addTarget:selfaction:@selector(buttonWasPressed:)forControlEvents:UIControlEventTouchUpInside в метод init.

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