更改特定单元格的UIButton

时间:2014-12-23 14:09:24

标签: ios objective-c uitableview uibutton

在特定的uitableviewcell中更新uibutton时出现问题。当我更改按钮颜色时,它会更新uitableview中的每个按钮。附上我的代码:

  PFObject *post = [self.objectArray objectAtIndex:indexPath.section];

    cell.likeBtn.layer.cornerRadius    = 5.0f;

    //To access button methods
    [cell.likeBtn    setTag:indexPath.section];


    NSMutableDictionary *attributes = [NSMutableDictionary
                                       dictionaryWithDictionary:[[TMMemoryCache sharedCache] objectForKey:post.objectId]];


    BOOL likedByCurrentUser = [[attributes objectForKey:@"likedByCurrentUser"] boolValue];

    if (likedByCurrentUser) {

        cell.likeBtn.backgroundColor = [UIColor flatRedColor];
        [cell.likeBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        [cell.likeBtn setTitle:@"Liked" forState:UIControlStateNormal];
    }else{

        //NSLog(@"Did not like %@", post.objectId);
        cell.likeBtn.backgroundColor = [UIColor flatBlueColor];
        [cell.likeBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        [cell.likeBtn setTitle:@"Like" forState:UIControlStateNormal];
    }

是他们在一个特定单元格中更新uibutton的更好方法吗?

2 个答案:

答案 0 :(得分:1)

根据更新信息的来源,有两种方法可以满足您的需求:

  1. cellForRowAtIndexPath:
  2. 中配置单元格时
  3. 让细胞管理自己的内容。
  4. 通常,#1是要走的路。当新信息进入您的UITableViewController时,请执行以下操作之一:

    1. 调用reloadData强制刷新整个表格。
    2. 找出需要更新的单元格,并调用reloadRowsAtIndexPaths:withRowAnimation:传递正确的索引路径值。
    3. 在其中任何一种情况下,您都可以在tableView:cellForRowAtIndexPath:方法的某个位置正确设置按钮。通常,我创建我的UITableViewCell子类来接受一个对象并使用该对象中的数据配置自己。这样,我的UITableViewController中处理单元格配置的代码就越少。

      tableView:cellForRowAtIndexPath:的典型实现如下:

      - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
          Cell *cell = [tableView dequeueReusableCellWithIdentifier:@"item" forIndexPath:indexPath];
          [cell configureForItem:self.dataSource[indexPath.row]];
          return cell;
      }
      

      每个UITableViewCell实例都有自己的按钮,该按钮将由self.dataSource[indexPath.row]中对象传递的数据进行配置。这样,当细胞被回收时,按钮不仅仅会被传递,而是每次需要新细胞时都会回收并配置一个新按钮。

答案 1 :(得分:0)

猜测,如果没有看到更多代码,我会说你的问题是使用indexPath.section而不是indexPath.row

如果每个部分有多个按钮,则此代码将覆盖所有按钮。