3

我有一个 UITableView,我想在其中插入和删除行。

如果我有一个包含 10 个值的数组并从包含所有行的 tableview 开始,则该表显示正常。然后,如果我想过滤除 [0, 1, 5] 之外的所有内容。然后我在索引路径删除行的过程: [2, 3, 4, 6, 7, 8, 9] 并且返回的行数是 3。我不必更改我的单元格渲染代码,它显示行:[0, 1, 5]。

但是,如果在过滤完所有内容后,我想返回此表并从持久性中加载包含行 [0, 1, 5] 的表,我遇到了麻烦。表格加载行数:3 并呈现单元格:[0, 1, 2]。

我尝试在 viewDidLoad 中用 0 行初始化表,然后在 viewDidAppear 中调用 insertRows:[0, 1, 5] - 但这会引发异常:

*** -[UITableView _endCellAnimationsWithContext:] 中的断言失败,/SourceCache/UIKit_Sim/UIKit-2380.17/UITableView.m:909

而且我已经验证了在 viewDidLoad 中,打印的行数是 0,而在抛出这个错误之前,打印的行数是 3。

编辑如果我插入 [0, 1, 2] - 它可以工作......但再次......我最终需要 [0, 1, 5] 出现。

- (void) viewDidAppear:(BOOL) 动画
 {
    [超级 viewDidAppear:动画];

    NSArray *initializing_indeces = @[[NSIndexPath indexPathForRow:0 inSection:0], [NSIndexPath indexPathForRow:1 inSection:0], [NSIndexPath indexPathForRow:5 inSection:0]];
    [self.userDataTable insertRowsAtIndexPaths:initializing_indeces withRowAnimation:UITableViewRowAnimationAutomatic];
}
- (int) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // 使用不同的布尔值,但要点:
    如果(viewDidLoad)
        返回0;
    if (viewDidAppear || 过滤)
        返回 3;
    如果(扩展)
        返回 10;
}
- (UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CELL"];

    如果(!单元格){
        单元格 = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CELL"];
    }


    [cell.textLabel setText:[NSString stringWithFormat:@"%i",indexPath.row]];

    返回单元格;
}
4

4 回答 4

1

我必须自己跟踪映射:

- (UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CELL"];

    如果(!单元格){
        单元格 = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CELL"];
    }


    int 行 = indexPath.row;
    如果(过滤){
        // 翻译 0 - 0
        // 翻译 1 - 1
        // 翻译 2 - 5
    }

    [cell.textLabel setText:[NSString stringWithFormat:@"%i", row]];

    返回单元格;
}

我最终使用了一个 NSMutableArray,它在过滤后变为 [0, 1, 5],因此访问该数组的索引, indexPath.row of 2 返回 5。

于 2013-02-12T05:04:07.503 回答
1

@鱼斯蒂克斯

[cell.textLabel setText:[NSString stringWithFormat:@"%i",indexPath.row]];

您的代码中的此方法明确指出,文本将是具有 indexPath.row 值的 NSString。现在,当您删除行和数据源时,从10 = [0, 1, 5] + [2, 3, 4, 6, 7, 8, 9]3 = [0, 1, 5]。您的数据源已减少为计数为 3 的数组。因此,您将仅获得三行作为返回的 bbynumberOfRowsInSection方法。三行将有这些 indexPath.row 的0, 1, 2。因此你得到0,1 ,2的不是0, 1 ,5.

如果您打印 indexPath,在cellForRowAtIndexPath方法中(过滤后)您将看到它们为 [0, 0] [0, 1] [0, 2] 分别表示第 0 节和第 0、1、2 行。因此你的结果

为了得到你想要的结果。做这个。取一个属性 @property (retain, nonAtomic) NSArray *dataArray;

viewDidLoad中: self.dataArray = [NSArray arrayWithObjects:@"0",@"1",@"2",@"3",@"4",@"5",@"6",@"7" ,@"8",@"9", 无];

numberOfRowsInSection中 返回 [数组计数];

并在cellForRow [cell.textLabel setText:[self.dataArray objectAtIndex:indexPath.row]];

现在只需在viewWillAppear或任何您想要的地方更改 dataSource(我的意思是 dataArray)为过滤或扩展状态)并使用 [self.tableView reloadData] 重新加载表数据;

希望我清楚。干杯,玩得开心。

于 2013-02-12T05:25:56.783 回答
0

首先在你的情况下不numberOfRowsInSection返回,所以请改变它NSIntegerint

我不知道究竟什么是共鸣。我认为这个问题必须与您的代码中的这一部分有关,

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

通常,您在其中一种数据源方法中犯了错误。可能无法说出究竟出了什么问题,但可能是这样的:您在thenumberOfRowsInSection在您的情况下为 10) 中告诉表格视图,thecellForRowAtIndexPath然后在您中仅处理10 - 1行。如果您向我们展示您的数据源的实现,那么您会更容易知道发生了什么。

于 2013-02-12T04:36:18.603 回答
0

对于每次插入,您需要使用重新加载表格视图[tableView realodData]

于 2013-02-12T05:23:33.810 回答