删除UITableViewCell的问题

时间:2013-07-10 15:18:47

标签: iphone ios uitableview

这非常奇特。我有一个UIViewController,它实现了UITableViewDelegate和UITableViewDatasource方法。我附加了委托和数据源属性,并验证它们是通过日志调用的。

我的表正在使用单元格原型单元格,它有两个部分,我正在使用节标题。

除了删除单元格外,我的表格工作正常(水平滑动单元格,然后应显示删除按钮)。它们正确显示它们应该显示的所有单元格,节标题,自定义单元格等...它们只是没有显示删除按钮。我可以从我的日志中看到正在调用editingStypeForRowAtIndexPath和canEditRowAtIndexPath,但是从不出现删除按钮。

但是,如果我编辑cellForRowAtIndexPath以返回标准UITableViewCells而不是我的子类,则会出现删除按钮。 UITableViewSubclass需要支持什么?我过去曾经有类似的代码工作而不需要这样做。

查看我的UITableViewCell子类:它只是一些文本标签,一个图像视图和位于背景图像顶部的按钮。没有什么不寻常的。

欢迎任何建议

这是我的电视代码:

#pragma mark UITableViewDataSource

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return 2;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    if(section == kInvitesReceivedSection){
        return self.invitesReceived.count;
    }
    else if(section == kInvitesSentSection){
        return self.invitesSent.count;
    }
    return 0;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    if(indexPath.section == kInvitesReceivedSection){
        SMInviteReceivedTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SMInviteReceivedTableViewCell"];
        cell.invite = self.invitesReceived[indexPath.row];
        cell.delegate = self;
        return cell;
    }
    else if(indexPath.section == kInvitesSentSection){
        SMInviteSentTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SMInviteSentTableViewCell"];
        cell.invite = self.invitesSent[indexPath.row];
        cell.delegate = self;
        return cell;
    }

 // Swap out for these and the delete button will appear
 //       UITableViewCell *cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
 //       cell.textLabel.text = [NSString stringWithFormat:@"%d", indexPath.row];
 //       return [[UITableViewCell alloc]init];
}

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {

    // programmatcially generate UIViews
    ...
    return headerView;
}


- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{

    if(section == 0 && self.invitesReceived.count == 0){
        return 0;
    }
    else if(section == 1 && self.invitesSent.count == 0){
        return 0;
    }
    return 44;
}

- (UITableViewCellEditingStyle)tableView:(UITableView *)aTableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
    NSLog(@"%s:%d indexPath=%@", __FUNCTION__, __LINE__, indexPath);
        return UITableViewCellEditingStyleDelete;

}

// This is called when the user swipes across a cell and presses delete.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
    NSLog(@"%s:%d indexPath=%@", __FUNCTION__, __LINE__, indexPath);
    if(indexPath.section == kInvitesReceivedSection){
       // delete invite
    }
    else if(indexPath.section == kInvitesSentSection){
       // delete invite
    }
}

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"%s:%d indexPath=%@", __FUNCTION__, __LINE__, indexPath);
    // Return YES if you want the specified item to be editable.
    return YES;
}

#pragma mark UITableViewDelegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    // do stuff here
}

编辑:当我在单元格上滑动时,我实际上注意到了这些日志。但是,当我在另一个单元格上滑动时,没有日志。这表示删除按钮处于活动状态但无法点按。为什么呢?

2013-07-10 08:24:57.400 Heartstream[35280:c07] -[SMInvitesViewController tableView:editingStyleForRowAtIndexPath:]:337 indexPath=<NSIndexPath 0xc44b180> 2 indexes [0, 0]
2013-07-10 08:24:57.400 Heartstream[35280:c07] -[SMInvitesViewController tableView:canEditRowAtIndexPath:]:369 indexPath=<NSIndexPath 0xc44b180> 2 indexes [0, 0]
2013-07-10 08:24:57.401 Heartstream[35280:c07] -[SMInvitesViewController tableView:editingStyleForRowAtIndexPath:]:337 indexPath=<NSIndexPath 0xc44b1b0> 2 indexes [0, 0]
2013-07-10 08:24:57.401 Heartstream[35280:c07] -[SMInvitesViewController tableView:canEditRowAtIndexPath:]:369 indexPath=<NSIndexPath 0xc44b1b0> 2 indexes [0, 0]
2013-07-10 08:24:57.401 Heartstream[35280:c07] -[SMInvitesViewController tableView:canEditRowAtIndexPath:]:369 indexPath=<NSIndexPath 0xc44b380> 2 indexes [0, 0]
2013-07-10 08:24:57.401 Heartstream[35280:c07] -[SMInvitesViewController tableView:editingStyleForRowAtIndexPath:]:337 indexPath=<NSIndexPath 0xc44b380> 2 indexes [0, 0]

1 个答案:

答案 0 :(得分:0)

对我而言,这是一个非常简单的答案。正如我所提到的,使用标准的UITableView单元格效果很好,但我的子类却没有。事实证明,我覆盖了layoutSubviews而没有调用

[super layoutSubviews];

卫生署! X(

希望这有助于其他人。