Selected UITableViewCell buttons change to unselected state after scrolling UITableView

Button action SongsSelectionSongs_Click

. When I click this button the button image changes, the button click count becomes correct, and after the selected button images also change, but when I scroll back and forth in UITableView

, the button image appears to randomly change.

enter image description here

This is my code:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"SongsTAbleViewCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if(cell == nil)
    {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"SongsTAbleViewCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];
    }

    btn_songSelect.tag = indexPath.row;
    lbl_songLabel.text = [[arr_tablVArray objectAtIndex:indexPath.row] objectForKey:@"SongTitle"];
    lbl_artistLabel.text = [[arr_tablVArray objectAtIndex:indexPath.row] objectForKey:@"SongArtist"];

    return cell;
}

-(IBAction)SongsSelectionSongs_Click:(id)sender
{
    UIButton *button = sender;
    CGPoint correctedPoint = [button convertPoint:button.bounds.origin toView:self.tblv_SongslisttableView];
    NSIndexPath *indexPath = [self.tblv_SongslisttableView indexPathForRowAtPoint:correctedPoint];
    NSLog(@"Button tapped in row %d",indexPath.row);

    SelectedAlbumUrl = [[arr_tablVArray objectAtIndex:indexPath.row] objectForKey:@"SongUrl"];
    str_songtitle = [[arr_tablVArray objectAtIndex:indexPath.row] objectForKey:@"SongTitle"];

    if ([[button backgroundImageForState:UIControlStateNormal] isEqual:[UIImage imageNamed:@"add.png"]])
    {
        btn_songsShareButton.userInteractionEnabled = YES;
        [btn_songSelect setBackgroundImage:[UIImage imageNamed:@"remove.png"] forState:UIControlStateNormal];
        buttonStatus = buttonStatus +1;
        [btn_songsShareButton setImage:[UIImage imageNamed:@"share selected.png"] forState:UIControlStateNormal];
        }
    else
    {
        [btn_songSelect setBackgroundImage:[UIImage imageNamed:@"add.png"] forState:UIControlStateNormal];
        buttonStatus = 1;
        [btn_songsShareButton setImage:[UIImage imageNamed:@"share unselected.png"] forState:UIControlStateNormal];
    }
}

      

+3


source to share


3 answers


// Try it, it works fine

pragma.h File

NSMutableArray * rowIdArray;

      



pragma.M File

@synthesize rowIdArray;

- (void)viewDidLoad
  {
    rowIdArray=[[NSMutableArray alloc]init];
  }

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
 {
   return 1;
 }

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
 {
   return [NamesArray count];
 }

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 {
   static NSString *CellIdentifier = @"Cell";
   ViewControllerCell *cell = (ViewControllerCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

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


        cell = [nib objectAtIndex:0];
     }
// Configure the cell...
  cell.nameslbl.text = [NamesArray objectAtIndex:indexPath.row];

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

   NSString *a=[NSString stringWithFormat:@"%d", indexPath.row];
   NSString *b=[[NSString alloc]init];

  for (int i=0;i<[rowIdArray count];i++)
   {
       b=[rowIdArray  objectAtIndex:i];

        if ([a isEqualToString:b])
         {

           UIImage *buttonImage = [UIImage imageNamed:@"star_selected.png"];
           [cell.nameBtn setBackgroundImage:buttonImage forState:UIControlStateNormal];
          }

       }

      return cell;
}

-(IBAction)NamesClick_Tapped:(id)sender
  {

    CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.NameTableView];

    NSIndexPath *indexPath = [self.NameTableView indexPathForRowAtPoint:buttonPosition];

    NSString *rowIdStr = [NSString stringWithFormat:@"%d", indexPath.row];

    if(![rowIdArray containsObject:rowIdStr])
     {

       [rowIdArray addObject:rowIdStr];

     }else{

      [rowIdArray removeObject: rowIdStr];

     }
    [self.NameTableView reloadData];
 }

      

+1


source


You don't do anything in yours cellForRowAtIndexPath

to select or deselect an image. When you reuse a cell, it does not change the state of the cell unless you explicitly specify it in cellForRow

. Hence, it will either reuse the selected or deselected cell (regardless of the first available reusable cell) and place it on the screen as it is.

To fix this problem, you need logic in the method cellForRowAtIndexPath

to select or deselect an image based on what is appropriate.


In general, if your problem has anything to do with "my cells are not showing correctly when scrolling", you are not using your cells correctly.



EDIT: In response to your comment, no, I will not rewrite your code. But I'll give you some direction.

I would recommend storing an extra key / value on yours arr_tablVArray

, which will track, enable or disable "share" (I would suggest a value bool

). This will make it so that you can check whether "sharing" is enabled or disabled by checking bool

instead of checking the content of the button image in your method IBAction

.

This information will now be available in your method cellForRowAtIndexPath

as well, and you can check the value for the current record in arr_tablVArray

and adjust your images accordingly, just as you set lbl_songLabel

and lbl_artistLabel

.

+2


source


when you reuse a cell where the button is already set, the same button appears with the previously set image. Instead of creating a new button every time you need a cell, you should simply reset the state of the existing button. This link can help you.

0


source







All Articles