3

我有一个带有自定义单元格的 UITableView,该单元格包含一个 UIImageView 和一个 UILabel。现在,当我第一次加载表格时,它会在每个单元格上加载相同的图像和不同的标签,这些标签来自 LabelArray。

现在我说的图像是一个单选按钮,所以当用户单击单元格时,图像会发生变化。如果用户再次单击它会更改为默认状态。

为此,我使用了这个函数,并且在我的 customcell 类中声明了一个名为 selectionStatus 的 bool 变量。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomCell * cell = (CustomCell* )[tableView cellForRowAtIndexPath:indexPath];

    if(indexPath.row == 0)
    {
        if(cell.selectionStatus == TRUE)
        {           
            //Do your stuff
           cell.selectionStatus = FALSE;
        }
        else
        {
            //Do your stuff
            cell.selectionStatus = TRUE;
        }
    }

    if(indexPath.row == 1)
    {
        if(cell.selectionStatus == TRUE)
        {           
            //Do your stuff
           cell.selectionStatus = FALSE;
        }
        else
        {
            //Do your stuff
            cell.selectionStatus = TRUE;
        }
    }
}

这很好用,(但我想知道它是否是正确的方法,或者我们可以检查 cell.selected 属性)并且我能够获得这种效果。但是现在当我关闭视图并再次打开它时

使用@Anil 根据以下评论进行编辑

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {

    if([self.checkedIndexpath count]  == 0)
    {
        [tableCell.selectionImage setImage:@"xyz.png"];
    }
    else
    {        
        for (int i =0; i <[self.checkedIndexPath count]; i++)
        {
            NSIndexPath *path = [self.checkedIndexPath objectAtIndex:i];
            if ([path isEqual:indexPath])
            {               
                [tableCell.selectionImage setImage:@"abc.png"]
            }
            else
            {
                 [tableCell.selectionImage setImage:@"xyz.png"]            
             }
    }
return tableCell;

问候兰吉特

4

4 回答 4

6

切换 UItableViewCells 的另一个选项...

如果单元格已被选中,在 willSelectRowAtIndexPath 中为 NSIndexPath 返回 nil,同时设置您的 _selectedIndexPath 实例变量。

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];

    if (cell.selected) {
        [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
        [self.tableView.delegate tableView:self.tableView didDeselectRowAtIndexPath:indexPath];
        indexPath = nil;
    }

    _selectedIndexPath = indexPath;

    return indexPath; 
}

在 didSelectRowAtIndexPath 和 didDeselectRowAtIndexPath 中,根据属性 cell.selected ... 更新您的单元格

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
    if (cell.selected) {
        // do stuff
    } else {
        // do stuff
    }
}

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
    if (cell.selected) {
        // do stuff
    } else {
        // do stuff
    }; 
}

最后在 viewDidLoad 中设置 clearsSelectionOnViewWillAppear 属性...

- (void)viewDidLoad {
    [super viewDidLoad];
    self.clearsSelectionOnViewWillAppear = NO;
}
于 2014-03-26T18:48:20.400 回答
3

您必须将所选行的索引路径保存在didSelectRowAtIndexPath中并检查cellForRowAtIndexPath中的索引路径:设置相应的图像

你要多选吗?试试这个...

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
CustomCell * cell = (CustomCell* )[tableView cellForRowAtIndexPath:indexPath];

if(indexPath.row == 0)
{
    if(cell.selectionStatus == YES)
    {     
      [self.checkedIndexPaths addObject:indexPath];
        //Do your stuff
       cell.selectionStatus = NO;
    }
    else
    {
        [self.checkedIndexPaths removeObject:indexPath];
        //Do your stuff
        cell.selectionStatus = YES;
    }
}
}  


像这样在 cellForIndexPath 中 编辑

 // Set the default image for the cell. imageXYZ   
for (NSIndexPath *path in self.checkedIndexPath) 
{
    if ([path  isEqual:indexPath])
    {
        //set the changed image for the cell. imageABC
    }
    // no need of else part
}

做我们将看到的确切

于 2013-01-31T12:01:59.213 回答
0

在您的模型类中获取一个布尔值并在 didSelectRow 方法上更新它并重新加载表。在 cellForRowAtIndexPath 中这样检查。

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

 After making your cell check like that 

    ModelClass *yourModel=[self.yourArray objectAtIndex:indexPath.row];
   if(yourModel.selection)
     [cell.customImage setImage:[UIImage imageName:@"selected"]; 
  else
     [cell.customImage setImage:[UIImage imageName:@"un_selected"];

}

检查此链接 https://github.com/adnanAhmad786/Quiz-View--TableView

于 2013-01-31T12:57:44.307 回答
0
  1. 首先,为了切换目的,在 tableview 单元格类中声明一个 bool 值 selectionStatus,如下所示:

    @property(nonatomic)BOOL 选择状态;

  2. 声明一个 NSMutableArray 来存储选定的索引路径(用于多选目的)

    self.checkedIndexPaths = [[NSMutableArray alloc] init];

  3. 在 didSelectRowAtIndexPath

    一种。如果布尔值 selectionStatus 为 No 将 indexPath 插入 NSMutableArray checkedIndexPaths 并设置 cell.selectionStatus = YES

    湾。如果布尔值 selectionStatus 为 Yes 从 NSMutableArray 中删除 indexPath 并设置 cell.selectionStatus = NO

    C。每次重新加载 tableView

找到下面的代码:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    tableCell = [self.tableView cellForRowAtIndexPath:indexPath];


        if(cell.selectionStatus == YES)
        {
            [self.checkedIndexPaths removeObject: indexPath];
            cell.selectionStatus = NO;

        }
        else
        {

            [self.checkedIndexPaths addObject: indexPath];
            cell.selectionStatus = YES;


        }

    [self.tablee reloadData];
}
  1. 在 cellForRowAtIndexPath 中

    一种。首先将单元格图像设置为未选中,即此处的 xyz.png

    [tableCell.selectionImage setImage:[UIImage imageNamed:@"xyz.png"]];

    湾。将图像设置为检查 NSMutable 数组 self.checkedIndexPaths 中的所有索引路径

    for (NSIndexPath *path in self.checkedIndexPaths)
    {
        if ([path  isEqual:indexPath])
        {
            [tableCell.selectionImage setImage:[UIImage imageNamed:@"abc.png"]];
        }
    
    }
    
于 2018-07-20T14:15:40.597 回答