滚动UITableView时,UITableViewCell选定按钮将更改为未选定状态

时间:2014-08-25 14:42:29

标签: ios objective-c uitableview

按钮操作为SongsSelectionSongs_Click。当我单击此按钮时,按钮图像更改,按钮点击计数变得正确,并且选定的按钮图像也在变化,但是当我在UITableView中来回滚动时,按钮图像似乎在随机变化。 / p>

enter image description here

这是我的代码:

- (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 个答案:

答案 0 :(得分:2)

您在cellForRowAtIndexPath内没有做任何事情来选择或取消选择图片。当您重复使用单元格时,它不会更改单元格的状态,除非您在cellForRow中明确告知它。因此,它将重用一个选定或取消选择的单元格(无论是第一个可用的可重用单元格),并将其按原样放在屏幕上。

要解决此问题,您需要使用cellForRowAtIndexPath方法中的逻辑来根据适当的选择选择或取消选择图像。


一般情况下,如果您的问题与“我的单元格在滚动时没有显示正确”有关,那么您可能无法正确重复使用单元格。

编辑以回复您的评论,我不会重写您的代码。但我给你一些指导。

我建议您在arr_tablVArray上保留一个额外的键/值,以跟踪是否应启用或禁用“共享”(我建议使用bool值)。这样做可以通过检查bool来检查是否启用/禁用“共享”,而不是通过IBAction方法检查按钮图像的内容。

此信息现在也可以在cellForRowAtIndexPath方法中使用,您可以在arr_tablVArray中查看当前记录的值,并相应地设置图片,就像设置lbl_songLabel一样}和lbl_artistLabel

答案 1 :(得分:1)

//试一试,它运作良好

pragma .h文件

NSMutableArray * rowIdArray;

pragma .M文件

@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];
 }

答案 2 :(得分:0)

当您重复使用已设置按钮的单元格时,会出现与之前设置的图像相同的按钮。您不必每次需要单元格时都创建新按钮,而应该重置现有按钮的状态。 This link可能会对您有所帮助。