我有一个包含两个部分的表。第一部分中的分段控件会更改第二部分中显示的行。我的问题是,在每次后续按下分段控件中的按钮时,行和第二部分中显示的行的顺序会不正确地移动。
我允许用户以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
答案 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。使用前两个按钮,用户将在第二部分中进行选择。您应该使用相机选择来维护该模式。只需要一个显示按钮的单元格即可唤起相机。是的,它增加了第二步但为用户建立了动力学模式:在第一部分中选择输入类型,然后在第二部分中选择一个合适的单元格。用户不应该每次都停下来思考他们是否需要点击第二部分中的一行。他们应该自动完成。