自定义单元格文本字段索引在滚动时更改

时间:2015-04-22 07:16:57

标签: ios objective-c xcode uitableview uitextfield

我在自定义单元格中有一个UITextField。一旦我在第一个和第二个单元格中输入了值,当我滚动时UITableView文本字段索引正在改变(第一个单元格值更改为最后一个单元格)。任何人都可以帮我解决我的问题吗?

这是我的代码:

static NSString *cellIdentifier = @"TableCellID";

CustomTableViewCell *cell = (CustomTableViewCell *) [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

if (cell == nil) {        
    cell = [[CustomTableViewCell alloc] init]; // or your custom initialization
}

cell.accessoryType = UITableViewCellAccessoryNone;
cell.selectionStyle = UITableViewCellSelectionStyleNone;

cell.txt_TCelltext.tag=indexPath.row;
cell.txt_TCelltext.placeholder=@"0.00";

[cell.txt_TCelltext setDelegate:self];

enter image description here

5 个答案:

答案 0 :(得分:3)

这是因为细胞重用。尝试从字典(或)数组中填充UITextField数据。试试这个:

- (UITableViewCell *)tableView:(UITableView *)tableViewLocal
         cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Your Code

    UITextField *textField = [[UITextField alloc]init];
    textField.delegate = self;
    textField.tag = indexPath.row;

    if ([myTextFieldDictionary objectForKey:[NSString stringWithFormat:@"%ld", (long)textField.tag]])
    {
        textField.text = [[myTextFieldDictionary objectForKey:[NSString stringWithFormat:@"%ld", (long)textField.tag]];
    }
}

-(void)textFieldDidEndEditing:(UITextField *)textField
{
    [myTextFieldDictionary setValue:textField.text
                             forKey:[NSString stringWithFormat:@"%ld", (long)textField.tag]];    
}

答案 1 :(得分:2)

您可以在Viewdidload中编写以下代码,在索引路径中编写行。

arrCells = [NSMutableArray new];

for (int i = 0; i < [[dic_demo objectForKey:@"Demo"] count]; i++) {
    NSArray *objects = [[NSBundle mainBundle] loadNibNamed:@"CustomTableViewCell" owner:self options:nil];
    CustomTableViewCell *cell = [objects objectAtIndex:0];
    [arrCells addObject:cell];

}-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

CustomTableViewCell *cell = [arrCells objectAtIndex:indexPath.row];
}

希望这会对你有所帮助

答案 2 :(得分:0)

如果是新创建的单元格,则为文本字段分配占位符/文本。 但是如果同一个单元格被重用并且重新使用了单元格,那么您没有将占位符/文本从当前索引路径的数据源分配给文本字段,而文本字段将显示以前索引路径的数据细胞是新创建的。因此,要解决您的问题,您需要根据当前索引路径的文本将文本分配给文本字段,而不管是新创建还是重用的单元格。

要解决此问题,您有两个选择 -

1)使用当前索引路径的文本字段数据更新可重用单元格文本字段的内容

2)如果可重复使用的单元格释放上一个文本字段并创建一个新文本字段,则使用当前行的数据进行初始化。

第二种方法涉及一些开销,所以我建议你用第一种方法来解决你的问题。

使用第一种方法的示例代码 -

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
    cell.backgroundColor=[UIColor clearColor];
    UITextField *textField = nil;

        if (cell == nil)
        {
            cell = [[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"cell"];
        }

    // assign placeholder text to text field
    [cell.textFiled setPlaceholder:[textFiledTextsArray objectAtIndex:indexPath.row]];

    return cell;
}

使用第二种方法的示例代码 -

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
    cell.backgroundColor=[UIColor clearColor];
    UITextField *textField = nil;

        if (cell == nil)
        {
            cell = [[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"cell"];
        }

    textField = [[cell contentView] viewWithTag:indexPath.row];
    if(textField ! = nil)
          [textField removeFRomSuperView];

    textField = [[UITextField alloc] initWithFrame:CGRectZero];

    // customize text filed

    // assign placeholder text to text field
    [textFiled setPlaceholder:[textFiledTextsArray objectAtIndex:indexPath.row]];

    [textField setTag:indexPath.row]; // set tag on text field

    [[cell contentView] addSubview:textField];

    [textField release];

    return cell;
}

注意:以上示例代码只是一个粗略的想法,请根据您的要求使用上述来源/自定义。

答案 3 :(得分:0)

static NSString *cellIdentifier = @"TableCellID"; 
in place of this line 
use NSString *cellIdentifier = [NSString stringWithFormat:@"Cell_%d_%d", indexPath.section, indexPath.row];

答案 4 :(得分:0)

在下面的函数中放置一个breakPoint,你可以看到每次单元格变为可见时都会调用它,因此你在该函数中的代码会重置textField中的文本。如果有什么东西打动了你,不要等!你可以用你自己的代码解决它。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath