Rakesh Kumar
Rakesh Kumar

Reputation: 71

Custom Cell Textfield index changing on Scrolling

I have a UITextField in a custom cell. Once I entered the value in first and second cells and when I scroll the UITableView textfield index are changing (first cell value changing to last cell). Can any one help me to resolve my issue?

Here is my code:

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

Upvotes: 2

Views: 1529

Answers (5)

sabir
sabir

Reputation: 626

You can write below code in Viewdidload and cell for row at index path.

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];
}

Hope this will help you

Upvotes: 2

Jaffer Sheriff
Jaffer Sheriff

Reputation: 1564

It is because of cell reuse. Try to populate the UITextField data from a dictionary (or) array. Try this:

- (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]];    
}

Upvotes: 3

Kaey
Kaey

Reputation: 4645

Place a breakPoint in the function below and you can see it gets called each time a cell becomes visible and hence your code inside that function resets the text in the textField. If something has struck you, don't wait! you can solve it with your own code.

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

Upvotes: 0

Sanjay Mohnani
Sanjay Mohnani

Reputation: 5967

If the cell is newly created, you assign a placeholder/ text to text filed. But if the same cell is reused and incase for the reused cell you didn't assign the placeholder/ text to the textfield from the data source of the current index path than the text filed will show the data for previous index path at which the cell was newly created. So to resolve your issue you need to assign the text to the text field based on the text for the current index path irrespective of the cell is newly created or reused.

To resolve this issue you have two options-

1) update the content of reusable cells text field with the data of the text field for current index path

2) in case of reusable cell release previous text field and create a new one, initialize with the data for the present row.

The 2nd approach involves some overhead, so I would suggest you to resolve your issue with 1st approach.

Sample code using 1st approach-

- (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;
}

Sample code using 2nd approach-

- (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;
}

Note: The above sample code is just a rough idea, please use the above source/ customize it as per your requirements.

Upvotes: 0

Venu Gopal Tewari
Venu Gopal Tewari

Reputation: 5876

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

Upvotes: 0

Related Questions