如何在删除

时间:2016-03-15 19:10:51

标签: ios uitableview

在UITableView控制器中,我刚刚添加了“轻扫”以删除'通过实施tableView: commitEditingStyle: forRowAtIndexPath。此外,可以选择行以展开更多内容。

滑动后的不良结果:

enter image description here

在取消删除动画完成后大约0.5秒后,两个较低的行保持在视图中。

IB的截图:

enter image description here

细胞内容物已经生长到下部细胞中,但没有显示它已被选中。 (选择会导致单元格增加高度并使其呈现浅灰色。)这发生在2个类似操作的视图控制器中的每一行上。

我已经尝试(没有成功)拦截“选择”'在几个UITableViewDelegate方法中,并没有找到如何阻止这种情况发生。我也尝试将IB动态原型单元设置为高度:85。

寻找有关如何防止此次扩张的想法。

编辑

- (void)viewDidLoad {
    ....
    self.tableView.rowHeight = UITableViewAutomaticDimension;
    self.tableView.estimatedRowHeight = kCellHeight;
    ....
}

#pragma mark - TableView delegate
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return [[self.fetchedResultsController sections] count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    id <NSFetchedResultsSectionInfo> sectionInfo = [self.fetchedResultsController sections][section];
    NSInteger *rows = (NSInteger *)[sectionInfo numberOfObjects];
    if (!self.rowsInSection)
        self.rowsInSection = rows;

    if (rows > 0)
        return [sectionInfo numberOfObjects];
    else {
        [tableView setSeparatorColor:[UIColor clearColor]];
        [tableView setBounces:NO];
        return 1;
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *identifier = self.rowsInSection > 0 ? @"numberIdentifier" : @"noNumbersIdentifier";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier forIndexPath:indexPath];
    if (self.rowsInSection > 0)
        [self configureCell:cell atIndexPath:indexPath];
    else
        cell.selectionStyle = UITableViewCellSelectionStyleNone;

    // [self.arrayOfIndexPaths addObject:indexPath];
    return cell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow];
    if (selectedIndexPath) {
        if (tableView.editing)
            return 85.0;
        else if (selectedIndexPath.row == indexPath.row)
            return 185.0;
    }

    return 85.0;
}

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)path {
    if (tableView.editing)
        return nil;

    //  If real rows exist, return the path, making row selectable
    if (self.rowsInSection > 0)
        return path;

    //  Otherwise do not allow the row to be selected
    return nil;
}

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    id <NSFetchedResultsSectionInfo> sectionInfo = [self.fetchedResultsController sections][0];

    if ([sectionInfo numberOfObjects] > 0)
        //  Return the contentView to stop the header from sliding with delete
        return [tableView dequeueReusableCellWithIdentifier:@"numberHeaderIdentifier"].contentView;
    else
        return [tableView dequeueReusableCellWithIdentifier:@"emptyHeaderIdentifier"];
}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return 75;
}

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
    Number *aNumber = [self.fetchedResultsController objectAtIndexPath:indexPath];
    [cell configureSubviewsInCell:cell withNumber:aNumber];
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView beginUpdates];
    [tableView endUpdates];
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
        [context deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]];
    }
}

2 个答案:

答案 0 :(得分:2)

您应该在未选择表格视图单元格时设置您不想显示的标签的隐藏属性。例如:

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
    Number *aNumber = [self.fetchedResultsController objectAtIndexPath:indexPath];

    UILabel *label1 = (UILabel *)[cell.contentView viewWithTag:501];
    label1.text = [aNumber valueForKey:@"number"];
    if (!cell.selected)
    {
       label1.hidden = YES;
    }
    else
    {
       label1.hidden = NO;
    }
    .....

}

然后在didSelectRowAtIndexPath:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView beginUpdates];
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    UILabel *label1 = (UILabel *)[cell.contentView viewWithTag:501];
    label1.text = [aNumber valueForKey:@"number"];
    label1.hidden = NO;
    [tableView endUpdates];
}

您应该研究UITableViewCell的子类化,这样您就不必使用标签来访问子视图。

答案 1 :(得分:2)

隐藏&#39; beowulf发布的解决方案是一个有效的选择。此外,由于滑动(开始编辑)导致单元格中的子视图变为“未被剪切”,因此需要覆盖一个方法,如下所示:

// this method is called as the swipe to delete is started
- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(nonnull NSIndexPath *)indexPath
{
    // only hide for unexpanded (unselected) cells
    if ([self.selectedRowIndex compare:indexPath] != NSOrderedSame)
    {
        NumberTableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
        // a cell subclass method to hide/unhide subviews that fall into
        //  the next cell below
        [cell subViewsInCellShouldBeHidden:YES];
    }
}