UITableView在单元格选择上更改图像并重置其他图像

时间:2014-01-31 15:22:23

标签: ios objective-c uitableview uiimageview

我想在用户选择行时更改UIImage内的UITableViewCell。多数民众赞成在现在太难了。我可以在didSelectRowAtIndex中做到这一点就好了。然而,继续问题,我希望其他单元格(每个cell都有标准图像)再次拥有标准图像。 (如果单元格再次具有标准图像,则应该“标记”所选图像(意味着未标记的图像将被标记的图像替换,我已经有了代码)

您从Checkbox了解HTML

这是我的尝试:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView cellForRowAtIndexPath:indexPath];
    [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:YES];

    //Little flashing animation
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    [UIView animateWithDuration:2.0f animations:^{

    } completion:^(BOOL finished) {
        ;
    }];

    //Mark the selected cell
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    ALog(@"%i", cell.imageView.tag);
    ALog(@"%i", [[[tableView cellForRowAtIndexPath:indexPath] imageView] tag]);

    UIImageView *iconimgView = (UIImageView *)[[tableView cellForRowAtIndexPath:indexPath] viewWithTag:TAG_IMAGEMARKERCELL];
    [iconimgView setImage:[UIImage imageNamed:@"circle-answer-marked.png"]];

    //..
}

此处定义UIImageView

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

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        //Add this to cell only once, not everytime a cell is displayed! (Everyhing goes in here)
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
        [[cell textLabel] setNumberOfLines:0]; // unlimited number of lines
        [[cell textLabel] setLineBreakMode:NSLineBreakByWordWrapping];
        [[cell textLabel] setFont:[UIFont fontWithName:@"PTSans-Regular" size:33 / 2]];
        [[cell textLabel] setTextColor:[self colorFromHexString:COLOR_DEFAULT_TEXT_COLOR]];
        cell.indentationLevel = cell.indentationLevel + 2;

        //        //Marker image
        imgCell_Marker = [[UIImageView alloc]initWithFrame:CGRectMake(10, 22, 20, 20)];
        imgCell_Marker.image=[UIImage imageNamed:@"circle-answer.png"];
        imgCell_Marker.tag = TAG_IMAGEMARKERCELL;
        ALog(@"%@", imgCell_Marker);
        [cell.contentView addSubview:imgCell_Marker];
    }

        //..
        return cell;
}

奇怪的是,UIImageView s有一个预定义的tag,但如果我想在didSelectRowAtIndexPath总是“0”那里得到它。 (tag)的默认值

提前致谢。

5 个答案:

答案 0 :(得分:7)

使用此代码块:

-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{   
    [tableView reloadData];
    UITableViewCell *cell = (UITableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
    cell.imageView.image = [UIImage imageNamed:@"image.png"];
}

首先,将所有单元格设置为默认条件,然后更改当前单元格的图像。

答案 1 :(得分:0)

从属性检查器中,将附件设置为prototypeCell的“Check Mark”。这将解决您的问题。无需更改图像或任何内容。如果这不是您想要的,请告诉我

答案 2 :(得分:0)

你在很多方面都有问题。

首先,确定应显示图像的信息应该是模型的一部分。因此,当选择一行时,在模型中设置一个标记,表示该项已被标记。同时,找到标记的其他项目并取消标记。现在,重新加载已更改的行。在cellForRowAtIndexPath中,根据模型中的标记信息更新请求的单元格以设置标准或替代图像。

其次,对于tag的使用 - 您在imgCell_MarkerimageView之间混淆了。当你这样做时:

ALog(@"%i", [[[tableView cellForRowAtIndexPath:indexPath] imageView] tag]);

您正在查询默认imageView,因此tag将始终为零。您应该使用viewWithTag:TAG_IMAGEMARKERCELL来查找所需的实际图像视图。

答案 3 :(得分:0)

让你的生活轻松。使用UITableViewCell :: selectedBackgroundView预先设置所选单元格的内容。

答案 4 :(得分:0)

注意:这在我的情况下是完美的,所以你可能不想在你的情况下使用它(或者让我解释为什么你应该在你和我一样的位置时)

代码现在看起来像这样:

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

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    [[cell textLabel] setNumberOfLines:0]; // unlimited number of lines
    [[cell textLabel] setLineBreakMode:NSLineBreakByWordWrapping];
    [[cell textLabel] setFont:[UIFont fontWithName:@"PTSans-Regular" size:33 / 2]];
    [[cell textLabel] setTextColor:[self colorFromHexString:COLOR_DEFAULT_TEXT_COLOR]];
    cell.indentationLevel = cell.indentationLevel + 2;

    //Marker image
    imgCell_Marker = [[UIImageView alloc]initWithFrame:CGRectMake(10, 22, 20, 20)];
    imgCell_Marker.image=[UIImage imageNamed:@"circle-answer.png"];
    imgCell_Marker.tag = TAG_IMAGEMARKERCELL;
    [cell.contentView addSubview:imgCell_Marker];

    //.. (more data here, just snipped it)
    return cell;
}

这就是我使用它的原因:

我知道UITableView的数据所在的数组只有前5个项目。因此,我只需删除cellForRowAtIndexPath UITableView方法中的if语句即可。它不会伤害我的应用程序(或浪费cpu时间),因为没有什么可做,没有人知道。

不过,这个解决方案有点难看。但在这种情况下它可以(我猜)