所以,这将是一个非常奇怪的问题需要解决。我将尝试尽可能具体。
以下是我的UITableViewController的片段:
- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellIdentifier = @"miscCell";
JASMiscConfigurationTableViewCell *cell = ((JASMiscConfigurationTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier]);
if (cell == nil) {
cell = [[JASMiscConfigurationTableViewCell alloc] init];
}
JASMiscellaneous *misc = [((NSMutableArray *)[_miscellaneousList objectAtIndex:indexPath.section]) objectAtIndex:indexPath.row];
[cell.itemNameLabel setText:misc.itemDescription.productCostDescription];
if ([misc.itemQuantity doubleValue] > 0) {
[cell.itemQuantityField setText:[misc.itemQuantity stringValue]];
}
return cell;
}
JASMiscConfigurationTableViewCell只是一个带标签和文本字段的自定义UITableViewCell。
这里的问题是:
如果我在单元格的UITextField中输入一个值并向下滚动页面,则在滚动时输入的值将按字面向下翻译。当我停止滚动时,它总是设法直接放在另一个行单元格的UITextField中。输入的值在离开原始UITextField时不会消失,它会浮动在屏幕的最前端。这不仅仅是一个GUI bug。当我遍历单元格中的值以将它们存储在对象中时,该值已转换为的UITextField实际上保持该值。还有什么陌生人,输入值的原始UITextField仍然保持该值。当我离开屏幕并重新输入时,两个文本字段都保持值。
对不起,如果这听起来很混乱。这对我来说很困惑。如果您需要任何澄清,我很乐意提供。感谢帮助。
答案 0 :(得分:0)
表视图重用单元格。当单元格在屏幕外滚动时,它将被添加到队列中,并将重新用于下一个要在屏幕上滚动的单元格。这意味着tableView:cellForRowAtIndexPath:
方法中的配置代码将在不同索引路径的同一单元上再次运行。
这意味着您需要每次更新itemQuantityField
的文本,而不仅仅是当数量大于零时。否则,单元格仍将具有之前在不同索引路径中使用的文本。
我已重写您的if ([misc.itemQuantity doubleValue] > 0) {...}
,以便nil
为零或更低时,文字设置为itemQuantity
。使用else
子句可以实现同样的目的。
BOOL validQuantity = [misc.itemQuantity doubleValue] > 0;
cell.itemQuantityField.text = validQuantity ? [misc.itemQuantity stringValue] : nil;
答案 1 :(得分:0)
正常分配cell = [[JASMiscConfigurationTableViewCell alloc] init];
不同于使用-reuseIdentifier
分配...
cell = [[JASMiscConfigurationTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
有可能
JASMiscConfigurationTableViewCell *cell = ((JASMiscConfigurationTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier]);
继续使用上一个单元格。
试试这个:
static NSString *cellIdentifier = @"miscCell";
JASMiscConfigurationTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]);
if (cell == nil) {
cell = [[JASMiscConfigurationTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
关于held/replaced when the cell leaves and reenters view
你错过了else语句:
if ([misc.itemQuantity doubleValue] > 0) {
[cell.itemQuantityField setText:[misc.itemQuantity stringValue]];
}
//set value if the condition is not met.
cell.itemQuantityField.text = @"no";