iPhone:在调用reloadSections后的UITableView部分中的单元格顺序更改:方法

时间:2010-03-30 08:29:59

标签: iphone uitableview cells grouped-table

我有一个包含两个部分的表。第一部分中的分段控件会更改第二部分中显示的行。我的问题是,在每次后续按下分段控件中的按钮时,行和第二部分中显示的行的顺序会不正确地移动。

我允许用户以3种不同的方式将产品添加到购物清单:按名称,通过条形码和用相机拍照。我在UISegmentedControl中有3个按钮,因此用户可以选择使用哪种方法。根据用户选择的第二段中的字段,应该更改为显示与该方法相关的单元格。

Section 0:
    0 row with segmented control showing name, barcode and camera buttons
Section 1:
    // button zero, name button
    0 row with textfield
    1 row with textfield 
or 
    // button 1, barcode button
    0 row with textfield
or 
    // button 2, camera button
    // shows camera view

我在每个UITextField中都放置了占位符。

每次单击分段控件中的按钮时,我都会调用更新tablevew的pickOne:方法。在该方法中,我使用NSRange(1,1)构造NSIndexSet,然后使用NSIndexSet作为参数调用UITableViewController的reloadSections:方法。

当视图第一次出现时,一切正常,但是当我反复单击按钮时,单元格的顺序会发生变化。包含button0和新placeHolders的两个textField的单元格将被写入旧单元格。 更糟糕的是,有时当我点击按钮0时,它只显示两个单元格的第二个单元格。

我的详细代码可在此处查看http://pastebin.com/9GwMpCS9

2 个答案:

答案 0 :(得分:0)

我看到了几个问题。

第一个重要的一点就是您将子视图添加到绕过contentView的单元格中。预定义样式的子视图根据其角色分为不同的部分。您具有编辑控件,内容视图和附件视图。虽然您可以直接添加到单元格的视图,但是会有奇怪的行为,因为预定义的单元格期望内容位于内容视图中。

我认为造成问题的原因是,每次装饰一个单元格时都会添加子视图,但是您永远不会删除它们。当一个单元格出列时,并不能保证一切都恢复到原始的新状态,就像分配了它一样。可以留下未删除的自定义附件视图等内容。我很确定这种情况正在发生。你正在收集应该干净的细胞上的视觉垃圾。

答案 1 :(得分:0)

我相信你的问题就在这里。

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    //....

        if(addMode == NAME) {
            if(indexPath.row == 0) {
                [cell addSubview:nameTextField];
            }
            else if(indexPath.row == 1) {
                [cell addSubview:categoryTextField];
            }
        }
        else if(addMode == BARCODE) {
            [cell addSubview:barcodeTextField];
        }
        else if(addMode == SCAN){

            //Scanning mode
        }
    }
    return cell;
}

这是因为表总是显示有两个部分,所以总是为第1部分调用此方法。无论选择何种输入类型,它都会创建或出列单元格并将其返回。每当addMode == SCAN时,它会随机将以前使用过的单元格之一出列名称或条形码addMode并返回该单元格。

我建议您完全从表中删除SCAN逻辑,或者为相机创建一行。

我认为后者是最好的UI。使用前两个按钮,用户将在第二部分中进行选择。您应该使用相机选择来维护该模式。只需要一个显示按钮的单元格即可唤起相机。是的,它增加了第二步但为用户建立了动力学模式:在第一部分中选择输入类型,然后在第二部分中选择一个合适的单元格。用户不应该每次都停下来思考他们是否需要点击第二部分中的一行。他们应该自动完成。