在分组表中重新排序行,同时保持每个组中的行数

时间:2010-09-08 00:54:36

标签: uitableview grouped-table

我有一个分组表,我希望用户能够重新排序。我想有两个小组。当我从A组移动一行到B组时,我希望B组的顶行移动到A组的底部。当我从B组移动到A组时,我想要底行将A组移至B组的顶部。

这样就可以保持表中每个组的大小。这可能吗?

非常感谢!

1 个答案:

答案 0 :(得分:0)

我无法找到一种明显的方法来执行此操作,导致行在拖动过程中移动。

但是,一旦拖动完成,我确实可以使用一些东西。但是,由于某些原因我不明白,拖动完成后显示屏被搞砸了。我正是这样做的:

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

- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    switch (section) {
        case INDEX_OF_SECTION_SELECTED_READOUTS:
            return NUMBER_OF_READOUTS_DISPLAYED;
            break;
        case INDEX_OF_SECTION_UNSELECTED_READOUTS:
            return NUMBER_OF_POSSIBLE_READOUT_CHOICES - NUMBER_OF_READOUTS_DISPLAYED;
            break;
        default:
            return 0;
            break;
    }
}

- (NSString *) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    switch (section) {
        case INDEX_OF_SECTION_SELECTED_READOUTS:
            return @"Displayed";
            break;
        case INDEX_OF_SECTION_UNSELECTED_READOUTS:
            return @"Available";
            break;
        default:
            return @"";
            break;
    }
}

- (int) getIndexFromIndexPath:(NSIndexPath *)indexPath {
    int index = indexPath.row;
    if (indexPath.section == INDEX_OF_SECTION_UNSELECTED_READOUTS) {
        index += NUMBER_OF_READOUTS_DISPLAYED;
    }
    return index;
}

- (void) tableView:(UITableView *) tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
    int fromIndex = [self getIndexFromIndexPath:fromIndexPath];
    int toIndex = [self getIndexFromIndexPath:toIndexPath];

    if (toIndex < fromIndex) {       
        // Shuffle the to row and everything beneath it down by one
        for (int i = fromIndex; i > toIndex; i--) {
            [readouts exchangeObjectAtIndex:i withObjectAtIndex:i-1];
        }
    }
    else {
        // Shuffle the to row and everything above it up by one
        for (int i=fromIndex; i < toIndex; i++) {
            [readouts exchangeObjectAtIndex:i withObjectAtIndex:i+1];    
        }
    }

    // Now update the order for the readouts
    for (int i=0; i < [readouts count]; i++) {
        NSString *key = [readouts objectAtIndex:i];     
        [readoutService setReadoutType:key index:i];
    }   
}

这应该是正确的,但是当拖动完成时,细胞完全从显示中丢失(只有背景可见细胞所在的位置)。

我尝试在moveRowAtIndexPath中调用[self.tableview reloadData],但是Apple的文档说“不应该在插入或删除行的方法中调用它,尤其是在通过调用beginUpdates和endUpdates实现的动画块中”

我坚持这一点并寻求如何解决显示问题的意见。