Как разрешить пользователю изменять текст в ячейках UITableView - PullRequest
2 голосов
/ 14 января 2012

У меня вопрос по поводу полезного представления.

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

Мой вопрос:

  1. , что я должен сделать, чтобы представить это текстовое поле в ячейках.

  2. Какие методы мне нужно реализовать, чтобы представить это текстовое поле в табличном представлении в режиме редактирования.

  3. Как только я закончу редактирование, Как я могу обновитьданные, которые находятся в моем контроллере представления контактов (содержит все контакты). Сохранение должно сохраняться в адресной книге.На этот вопрос я знаю, что мне нужно реализовать какой-то метод делегата, но я не уверен, как это сделать.

Пожалуйста, взгляните на следующий код, так что вы получитеидея о моей проблеме.

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath
{
[tableView setSeparatorColor:[UIColor clearColor]];
//[self.tableView setEditing: YES  animated: YES];


static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}

// Configure the cell...
if(isEditingOn) {

if(cell == nil)
        cell = [self getCellContentView:CellIdentifier];
     UILabel *lblTemp1 = (UILabel *)[cell viewWithTag:1];
     UITextField *textfield1=(UITextField*)[cell viewWithTag:2];

if(indexPath.row == 0) {
        lblTemp1.text = @"Name";
        textfield1.text = myContact.name;
    }

else if(indexPath.row == 1) {
        lblTemp1.text = @"Phone";
        textfield1.text = myContact.phone;
    }

else if(indexPath.row == 2) {
        lblTemp1.text = @"Email";
        textfield1.text = myContact.email;
}

}

else {    

if(indexPath.row == 0) {
    cell.textLabel.text = myContact.name;
}

else if(indexPath.row == 1) {
    cell.textLabel.text = myContact.phone;
}

else if(indexPath.row == 2) {
    cell.textLabel.text = myContact.email;
}
}


return cell;

}

- (UITableViewCell *) getCellContentView:(NSString *)cellIdentifier {

CGRect CellFrame = CGRectMake(0, 0, 60, 20);
CGRect Label1Frame = CGRectMake(10, 10, 180, 25);
UILabel *lblTemp;
UITableViewCell *cell = [[[UITableViewCell alloc] initWithFrame:CellFrame  reuseIdentifier:cellIdentifier] autorelease];
lblTemp = [[UILabel alloc] initWithFrame:Label1Frame];
lblTemp.tag = 1;
[cell.contentView addSubview:lblTemp];
[lblTemp release];
CGRect TextFieldFrame=CGRectMake(240, 10, 60, 25);
UITextField *textfield;
textfield=[[UITextField alloc]initWithFrame:TextFieldFrame];
textfield.tag=2;
textfield.placeholder = @"";
[cell.contentView addSubview:textfield];

}

Ответы [ 2 ]

5 голосов
/ 14 января 2012

Это действительно сложный вопрос, чтобы ответить на него полностью и подробно с помощью примеров кода, но я постараюсь указать вам правильное направление.

1) Добавьте UITextField в качестве подпредставления вашегоячейка таблицы при создании ячейки в tableView: cellForRowAtIndexPath: метод (я предполагаю, что именно для этого предназначен ваш метод getCellContentView:).Установите тег в вашем UITextField, который соответствует индексу строки ячейки, и сделайте ваш tableviewcontroller делегатом для ячейки.Установите текстовое поле скрытым.(не забывайте устанавливать тег каждый раз при запросе ячейки, а не только при первом ее создании).

2) В tableView: didSelectRowAtIndexPath: метод захватите ячейку, используя tableViewCellForRowAtIndexPath, а затем отобразите текстовое поле внутриэто (вам, возможно, придется сделать некоторый обход просмотра, чтобы получить его) и вызвать в текстовое полеcomeFirstResponder.

3) Когда пользователь что-то наберет, ваши методы textfielddelegate будут запущены.Вы можете посмотреть на тег в текстовом поле, чтобы определить, к какой строке относится поле, а затем обновить источник данных новым текстом.Затем просто перезагрузите таблицу, чтобы скрыть текстовое поле и обновить содержимое ячейки.

Если вы знаете, как использовать пользовательские подклассы ячеек таблицы, вы можете немного упростить свою жизнь, создав пользовательскую ячейку, которая уже содержит текстовое поле.и имеет свойство для доступа к нему, но в противном случае метод будет в основном таким же.

Кроме того, tableView: didSelectRowAtIndexPath: обычно не срабатывает, когда просмотр таблицы находится в режиме редактирования, если вы не установили tableView.allowsSelectionDuringEditing = YES;

1 голос
/ 22 октября 2016

Лучше использовать 2 UITableViewCell с, первый для view и последний для edit.

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

Давайте начнем:

  1. Сначала я зависел от действия accessoryButtonTap по редактированию строки:

    var rowToEdit: IndexPath? = nil
    
    override func tableView(_ tableView: UITableView, accessoryButtonTappedForRowWith indexPath: IndexPath) {
      // End edit mode if one cell being in edit mode other than this one
      if let row = self.rowToEdit {
         // return current edit cell to view mode
         self.rowToEdit = nil
         self.tableView.reloadRows(at: [row], with: .automatic)
      }
    
      self.rowToEdit = indexPath
      self.tableView.reloadRows(at: [self.rowToEdit!], with: .automatic)
    }
    
  2. Различают 2 режима при загрузке ячейки:

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
      if indexPath == self.rowToEdit {
         let cellId = "ContactEditTableViewCell"
         let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath as IndexPath) as! ContactEditTableViewCell
         cell.accessoryType = .none
         self.configEditCell(cell: cell, indexPath: indexPath)
         return cell
      } else {
         let cellId = "ContactTableViewCell"
         let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath as IndexPath) as! ContactTableViewCell
    
         self.configCell(cell: cell, indexPath: indexPath)
         return cell
      }
    }
    
  3. Дополнительная опция, если вы хотите изменить высоту в зависимости от режима:

    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
      if indexPath == self.rowToEdit {
         return 120
      } else {
         return 70
      }
    }
    
  4. Последний вариант добавления кнопок Save и Cancel: Я добавил их к каждому cell, поэтому я передаю ссылку на ContactTable каждой ячейке.

    @IBAction func btnSave_click(_ sender: UIButton) {
        // save the record
    
        btnCancel_click(sender)
    }
    
    @IBAction func btnCancel_click(_ sender: UIButton) {
        let tmp = self.tbl.rowToEdit
        self.tbl.rowToEdit = nil
        self.tbl.tableView.reloadRows(at: [tmp!], with: .automatic)
    }
    

    Screenshot

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