1

我有一张有两个部分的桌子。第一部分中的分段控件会更改在第二部分中显示哪些行。我的问题是行的顺序和在第二部分中显示的行在每次随后按下分段控件中的按钮时都会发生不正确的变化。

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

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 中都放置了占位符。

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

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

我的详细代码可以在这里看到http://pastebin.com/9GwMpCS9

4

2 回答 2

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。使用前两个按钮,用户可以在第二部分中进行选择。您应该使用相机选择来保持这种模式。只要有一个单元格显示一个唤起相机的按钮。是的,它增加了第二步,但为用户建立了一个动态模式:在第一节中选择输入类型,然后在第二节中选择适当的单元格。用户不必每次都停下来思考他们是否需要点击第二部分中的某一行。他们应该自动这样做。

于 2010-03-30T16:13:16.207 回答
0

我看到了几个问题。

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

我认为导致您的问题的原因是每次装饰单元格时您都在添加子视图,但您从不删除它们。当一个单元出列时,不能保证一切都恢复到原始的新状态,就好像它被分配了一样。可以留下诸如未删除的自定义附件视图之类的东西。我很确定这正在发生。您正在收集应该清洁的单元格上的视觉垃圾。

于 2010-03-30T15:27:03.460 回答