如何让用户修改UITableView单元格中的文本

时间:2012-01-13 22:40:53

标签: ios xcode uitableview

我有一个关于合适视图的问题。

我正在实现一个类似于地址簿app的应用程序。我能够以编辑模式呈现表格视图。我想让用户在编辑模式下编辑单元格中的文本。我知道为了编辑单元格中的文本,我需要一个文本字段。我创建了一个文本域。

我的问题是:

  1. 我该怎么做才能在单元格中显示该文本字段。

  2. 为了在编辑模式下在表格视图中显示该文本字段,我需要实现哪些方法。

  3. 完成编辑后,如何更新联系人视图控制器中的数据(包含所有联系人)。保存应保留在地址簿中。对于这个问题,我知道我需要实现一些委托方法,但我不知道该怎么做。

  4. 请查看以下代码,以便了解我的问题。

     - (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 个答案:

答案 0 :(得分:5)

这是一个非常复杂的问题,可以通过代码示例全面而深入地回答这个问题,但我会尝试指出正确的方向。

1)在tableView:cellForRowAtIndexPath:方法中创建单元格时,添加一个UITextField作为表格单元格的子视图(我假设这是你的getCellContentView:方法的用途)。在UITextField上设置一个与单元格的行索引匹配的标记,并使tableviewcontroller成为单元格的委托。将文本字段设置为隐藏。 (记得每次请求单元格时都设置标记,而不仅仅是第一次创建它时。)

2)在tableView:didSelectRowAtIndexPath:方法中,使用tableViewCellForRowAtIndexPath获取单元格,然后在其中显示文本字段(您可能需要进行一些视图遍历才能获得它)并在文本字段中调用becomeFirstResponder。

3)当用户键入内容时,将触发textfielddelegate方法。您可以查看文本字段上的标记以确定字段所属的行,然后使用新文本更新dat源。然后只需重新加载表以隐藏文本字段并更新单元格内容。

如果您知道如何使用自定义表格单元子类,那么您可以通过创建一个已经包含文本字段并具有访问它的属性的自定义单元格来使您的生活更轻松,但是否则该技术将大致相同。

另外,tableView:didSelectRowAtIndexPath:当tableview处于编辑模式时通常不会触发,除非你设置tableView.allowsSelectionDuringEditing = YES;

答案 1 :(得分:1)

最好使用2 UITableViewCell s,第一个用于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. 在加载单元格时区分两种模式:

    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. 添加SaveCancel按钮的最后一个选项: 我将它们添加到每个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