使用自定义UITableViewCell在UITableView中执行单行选择?

时间:2014-09-20 06:25:14

标签: ios uitableview

我知道这个问题有很多答案。但它没有达到预期的效果。 didDEselectrow无法正常工作。我有一个UIImageView,我已设置为在cellforRowAtIndex中隐藏True。当有人选择hidden的任何行值时,将其设置为false。

**我的主要问题是当我选择另一行时,前一行状态不会改变,它也会显示已选中。我附上了必要的代码片段,请检查并帮助我完成此操作。 **

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    EventTypeTableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"Event_Type" forIndexPath:indexPath];

    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    if (cell.selectionStatus)
        [cell.selectEvent setHidden:NO];
    else
        [cell.selectEvent setHidden:YES];

    [cell.eventTypeName setText:[eventTypeName objectAtIndex:indexPath.row]];

    return cell;
}


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

    if(cell.selectionStatus == TRUE)
    {
        cell.selectionStatus = FALSE;
    }
    else
    {
]        cell.selectionStatus = TRUE;
    }
    [tableView reloadData];
}

-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath {
    EventTypeTableViewCell *cell = (EventTypeTableViewCell *)[self.tableView cellForRowAtIndexPath:indexPath];
    if(cell.selectionStatus == FALSE)
    {
        //Do your stuff
        cell.selectionStatus = TRUE;
    }
    else
    {
        //Do your stuff
        cell.selectionStatus = FALSE;
    }
    [tableView reloadData];
}

2 个答案:

答案 0 :(得分:0)

我怀疑没有调用didDeselect,因为你允许在tableView中进行多项选择。

您是否将表格视图的选择样式设置为“单选”?您可以在界面构建器/故事板中执行此操作,也可以以编程方式执行此操作:

- (void) viewDidLoad {
    self.tableView.allowsMultipleSelection = NO;
}

这样当您选择另一行时,它将取消选择旧选择。此外,您可以通过在每个单元格的选定状态更改时不调用[tableView reloadData]来简化代码并使一切看起来更好。我建议这样做的方法是,只要单元格的选择发生变化,就会在selectEvent内更改EventTypeTableViewCell的隐藏状态。

这让你知道:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    EventTypeTableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"Event_Type" forIndexPath:indexPath];

    [cell.eventTypeName setText:[eventTypeName objectAtIndex:indexPath.row]];

    return cell;
}

EventTypeTableViewCell

的定义中有一些方法覆盖
@implementation EventTypeTableViewCell

///  Your code ///

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];
    self.selectEvent.hidden = !selected;
}

@end

答案 1 :(得分:0)

试试这个::

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath   *)indexPath
{
     [tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryCheckmark;
}

-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath 
{
    [tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryNone;
}