我有一个包含单元格的表,每个单元格中都有一个UITextField。我将这些textfields的委托设置为self并在编辑结束时进行一些计算。
我的问题在于文本字段,每当我输入第一个字段以外的字段时,除了第一个字段之外的所有文本字段都会更新。当我输入第一个时,其他人完全更新。
这让我检查了哪些数据被更新,虽然我将cell.textLabel.text
设置为等于数组中的特定位置,但它没有显示该位置的值。
这是我的cellForRowAtIndex
方法:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
UITextField *tf;
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
cell.accessoryType = UITableViewCellAccessoryNone;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
tf = [[UITextField alloc] initWithFrame:CGRectMake(self.view.frame.size.width/2 + 25,
5,
cell.contentView.frame.size.width/2 - 25 - 25,
cell.contentView.frame.size.height - 10)];
tf.font = [UIFont fontWithName:@"Helvetica" size:16];
tf.textAlignment = NSTextAlignmentLeft;
tf.backgroundColor = [UIColor clearColor];
tf.textColor = [UIColor blueColor];
tf.tag = indexPath.row;
tf.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
tf.returnKeyType = UIReturnKeyDone;
tf.delegate = self;
tf.keyboardType = UIKeyboardTypeNumbersAndPunctuation;
cell.textLabel.text = [_titles objectAtIndex:indexPath.row];
tf.placeholder = cell.textLabel.text;
[cell.contentView addSubview:tf];
}
else
{
tf = (UITextField *)[cell viewWithTag:indexPath.row];
}
tf.text = [NSString stringWithFormat:@"%.2f", [[_data objectAtIndex:indexPath.row] floatValue]];
NSLog(@"Value at index %i is %.2f", indexPath.row, [[_data objectAtIndex:indexPath.row] floatValue]);
cell.textLabel.text = [_titles objectAtIndex:indexPath.row];
return cell;
}
当我尝试这个时,经过我的计算,这就是记录的内容:
指数0的值为1.20
指数1的值为1.00
指数2的值为4.55
然而,第一个文本字段仍显示0而不是1.20
添加这些文本字段我在哪里出错?
答案 0 :(得分:0)
每次创建文本字段并将其放在同一位置时...所以您的新文本字段是在之前创建的文本字段的基础上创建的。
您需要查看此声明
UITextField *tf;
和
tf = [[UITextField alloc] initWithFrame:CGRectMake(self.view.frame.size.width/2 + 25, 5,
cell.contentView.frame.size.width/2 - 25 - 25,
cell.contentView.frame.size.height - 10)];
仅当前一个不存在时才使用alloc + init。与您对cell
的操作类似。
修改
检查标签。如果我没有误会,默认标签为0,因此当使用viewWithTag
时,它可能会选择textLabel而不是textfield。将文本字段的标记设置为indexPath.row + 5
。
答案 1 :(得分:0)
这行代码看起来错误:
tf = (UITextField *)[cell viewWithTag:indexPath.row];
因为如果您重复使用TableViewCell,该行将不匹配
例如单元格被创建为第0行并在第10行重用。因此tf
将为nil且不会更新。
每个单元格都是它自己的小生态系统,因此您的文本字段的每个单元格都不需要不同的标记。它可能只是
tf.tag = SOME_CONSTANT;
此外,我假设您要求表视图重新加载它的数据。