iProRage
iProRage

Reputation: 424

Adding a UITextField to a UITableViewCell only shows a textField in the LAST cell

I have a table view that has many cells. Each cell has its own UITextField. I added the text fields programmatically. I want each and every textField to appear when the edit button is hit. (now table is in edit mode) and when pressed again, i want all of the textFields to vanish(leaving the edit mode). I know that i can accomplish this using the hidden property, but i tried doing this in this method:

    - (IBAction)editButton:(id)sender 
{
    if (self.editing) 
    {
        [self setEditing:NO animated:YES];
        [self.myTableView setEditing:NO animated:YES];
        EditButton.title = @"Edit";
        cellText.hidden = YES;  //<-- THIS IS THE CODE
    } 
    else 
    {
        [self setEditing:YES animated:YES];
        [self.myTableView setEditing:YES animated:YES];
        EditButton.title = @"Done";
        cellText.hidden = NO;  //<-- THIS IS THE CODE
    }
}

but it only shows and hides the VERY LAST cell's textField. How can i get it to where it shows and then doesnt show EVERY cell's textFIeld? Many thanks in advance!!!

CELL FOR ROW

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
     {
         cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];


         cellText = [[UITextField alloc]init];
         [cellText setFrame:CGRectMake(190, 15, 55, 30)];
         cellText.text = @"1";
         cellText.borderStyle = UITextBorderStyleRoundedRect;
         cellText.hidden = YES;
         cellText.userInteractionEnabled = NO;
         [cell addSubview:cellText];
    }    

return cell;
}

Thanks in advance!! :D

Upvotes: 0

Views: 3844

Answers (4)

Balakrishnan Mca
Balakrishnan Mca

Reputation: 747

Try this code

- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationItem.rightBarButtonItem = self.editButtonItem;
}



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

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
UITextField * cellText = [[UITextField alloc] initWithFrame:CGRectMake(1, 1, 100, 30)];
cellText.tag = 1;
cellText.textColor = [UIColor darkTextColor];
//cellText.numberOfLines = 0;
cellText.font = [ UIFont fontWithName: @"Helvetica-Bold" size: 12.0 ] ; 
cellText.backgroundColor = [ UIColor clearColor ] ;
cellText.text = @"123";
    cellText.hidden = YES;
[cell.contentView addSubview:cellText];
[cellText release];
cellText =nil;

// Set up the cell...


return cell;
}
- (UITableViewCellEditingStyle)tableView:(UITableView *)aTableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
// Detemine if it's in editing mode
  UITextField *cellText = (UITextField *)[[aTableView cellForRowAtIndexPath:indexPath] viewWithTag:1];
if (!self.editing) 
{
    [self setEditing:NO animated:YES];
    [self.tableView setEditing:NO animated:YES];
   // EditButton.title = @"Edit";

    cellText.hidden = YES;  //<-- THIS IS THE CODE
} 
else 
{
    [self setEditing:YES animated:YES];
    [self.tableView setEditing:YES animated:YES];
  //  EditButton.title = @"Done";
    cellText.hidden = NO;  //<-- THIS IS THE CODE
}

return UITableViewCellEditingStyleNone;
}

hi friend this code is working fine for me, believe you too have a grate day

Upvotes: 1

Ajay Sharma
Ajay Sharma

Reputation: 4517


You can get rid of this issue, using this trick, I am not sure as if it would create the memory leak within your code.Since, it create new cell each time.But surely you can use it,if you don't get some proper way of doing it. ;)

- (IBAction)editButton:(id)sender 
{
 if (self.editing) 
        {
            [self setEditing:NO animated:YES];
            [self.myTableView setEditing:NO animated:YES];
            EditButton.title = @"Edit";

        } 
        else 
        {
            [self setEditing:YES animated:YES];
            [self.myTableView setEditing:YES animated:YES];
            EditButton.title = @"Done";

        }
        [self.myTableView reloadData];
}

After reloading the TableView, check the condition in cellForRowAtIndexPath, either pass the value of self.editing to TextField which makes it hide/show.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell  = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];


    cellText = [[UITextField alloc]init];
    [cellText setFrame:CGRectMake(190, 15, 55, 30)];
    cellText.text = @"1";
    cellText.borderStyle = UITextBorderStyleRoundedRect;
    cellText.hidden = YES;
    cellText.backgroundColor = [UIColor redColor];
    cellText.userInteractionEnabled = NO;
    [cell addSubview:cellText];

    cellText.hidden=!self.editing;

    return cell;
}

Upvotes: 1

Costique
Costique

Reputation: 23722

Although you create a text field for each cell, you keep a reference only to the last one in the ivar named cellText. That's why you show/hide the only text field.

I suggest you reload the table when toggling the editing mode, and set the text fields visibility in tableView:cellForRowAtIndexPath:.

Oh, and you should release cellText after adding it as a subview. Otherwise you are leaking memory. And it is highly recommended that you add subviews to UITableViewCell content view, rather than directly to the cell.

Upvotes: 1

Kevin Low
Kevin Low

Reputation: 2682

This is actually normal. Per the Apple documentation under addSubview:

Views can have only one superview. If view already has a superview and that view is not the receiver, this method removes the previous superview before making the receiver its new superview.

So it will keep removing it adding and removing from cells until it gets to the last one.

Upvotes: 0

Related Questions