Добавление UITextField к UITableViewCell показывает только textField в последней ячейке - PullRequest
0 голосов
/ 12 января 2012

У меня есть табличное представление, в котором много ячеек. Каждая ячейка имеет свой собственный UITextField. Я добавил текстовые поля программно. Я хочу, чтобы каждый текстовое поле появлялось при нажатии кнопки редактирования. (теперь таблица находится в режиме редактирования) и при повторном нажатии я хочу, чтобы все textFields исчезли (выход из режима редактирования). Я знаю, что могу сделать это, используя свойство hidden, но я попытался сделать это следующим способом:

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

, но он показывает и скрывает только текстовое поле ячейки ОЧЕНЬ ПОСЛЕДНИЙ. Как я могу получить его там, где он показывает, а затем не показывает текстовое поле КАЖДОЙ ячейки? Большое спасибо заранее !!!

Ячейка для строки

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

Спасибо заранее !! : D

Ответы [ 4 ]

1 голос
/ 12 января 2012

Попробуйте этот код

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

Привет, друг, этот код работает нормально для меня, поверь, у тебя тоже есть хороший день

1 голос
/ 12 января 2012

Несмотря на то, что вы создаете текстовое поле для каждой ячейки, вы сохраняете ссылку только на последнее в иваре с именем cellText.Вот почему вы показываете / скрываете только текстовое поле.

Я предлагаю вам перезагрузить таблицу при переключении режима редактирования и установить видимость текстовых полей в tableView:cellForRowAtIndexPath:.

Дадолжен выпустить cellText после добавления его в качестве подпредставления.В противном случае вы теряете память.И настоятельно рекомендуется добавлять подпредставления в UITableViewCell представление содержимого, а не непосредственно в ячейку.

1 голос
/ 12 января 2012

Вы можете избавиться от этой проблемы, используя этот трюк, я не уверен, что он вызовет утечку памяти в вашем коде. Так как он создает новую ячейку каждый раз. Но, конечно, вы можете использовать ее, если вы не не получить правильный способ сделать это. ;)

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

После перезагрузки TableView проверьте условие в cellForRowAtIndexPath, либо передайте значение self.editing в TextField, что делает его скрытым / отображаемым.

- (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;
}
0 голосов
/ 12 января 2012

Это на самом деле нормально.Согласно документации Apple под addSubview:

Представления могут иметь только одно суперпредставление.Если представление уже имеет суперпредставление и это представление не является получателем, этот метод удаляет предыдущее суперпредставление перед тем, как сделать получатель его новым суперпредставлением.

Таким образом, он будет продолжать удалять его, добавляя и удаляя из ячеек, покадоходит до последнего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...