在自定义UITableViewCell UITextField中输入的值转换为其他字段

时间:2015-06-12 15:17:47

标签: ios objective-c uitableview ipad

所以,这将是一个非常奇怪的问题需要解决。我将尝试尽可能具体。

以下是我的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仍然保持该值。当我离开屏幕并重新输入时,两个文本字段都保持值。

对不起,如果这听起来很混乱。这对我来说很困惑。如果您需要任何澄清,我很乐意提供。感谢帮助。

2 个答案:

答案 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";