访问嵌入在单元格中的textField

时间:2012-12-24 04:06:58

标签: ios uitableview uitextfield uitextfielddelegate

我创建了一个表,它动态创建自定义包含textField的单元格。当我运行程序时,我可以在textFields中输入文本。但是,在退出程序/切换到另一个viewController之前,我无法收集输入的文本。你能否提出我应该做些什么来提取用户输入的文字。

我知道我可以使用以下代码访问单元格...

for (int section = 1; section < [self.tableView numberOfSections]; section++) // section 0: profile picture
{
    for(int row = 0; row < [self.tableView numberOfRowsInSection:section]; row++)
    {
        NSLog(@"section = %d, row = %d", section, row);
        NSIndexPath *tempIndexPath = [NSIndexPath indexPathForRow:row inSection:section];
        UITableViewCell *tempCell = [self tableView:self.tableView cellForRowAtIndexPath:tempIndexPath];
//            NSLog(@"tempCell = %@", tempCell);

    }
}

但我无法提取其中包含的文字。

我还提到:Accessing UITextField in a custom UITableViewCell。但我正在寻找一个更清洁的解决方案。

谢谢!

3 个答案:

答案 0 :(得分:1)

您引用的链接非常接近您需要执行的操作,但是有更好的方法来获取indexPath。

从iOS编程开始时常见的错误概念是您需要在需要数据时获取文本字段的所有值(例如当用户点击“提交”时)。问题,特别是当它们在表中时,问题是文本字段并不总是可用。如果单元格不在屏幕上,则很可能不存在,或者它已在表格的不同行中重复使用。文本字段为视图,应该显示数据,而不是您存储它的模型。

因此,您需要做的第一件事是使视图控制器符合UITextFieldDelegate协议,并在创建视图控制器时设置文本字段的委托:

您的.h文件(<UITextFieldDelegate>是重要部分):

@interface YourViewController : UIViewController <UITextFieldDelegate>

创建文本字段时:

myNewTextfield.delegate = self;

这告诉文本字段通知您对它​​的重要更改。现在,您只需要在完成编辑文本字段后立即创建一个名为的文本字段委托方法,并等待它被调用,以便您可以存储文本:

- (void) textFieldDidEndEditing:(UITextField *)textField {
    // If you need the index path of the table view cell which contains the text field in order to know how to store it, use:
    CGRect position = [self convertRect:textField.frame toView:self.tableView];
    NSArray *indexPaths = [self.tableView indexPathsForRowsInRect:position];
    NSIndexPath *indexPath = [indexPaths objectAtIndex:0];

    // Save the contents of the text field somewhere so that you have it later when you need it:
    something = textField.text;
}

答案 1 :(得分:0)

This教程对我很有帮助。您可以通过标记引用所需的任何对象。

在故事板中拖动UIImageViewUITextField等并将标记设置为100(无论您想要什么),然后在- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath中使用标记引用它。

这是你可以做的事情,只需记住在故事板中设置标签:

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

// Configure the cell...
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

 UITextField *tField = (UITextField *)[cell viewWithTag:100];

return cell;
 }

答案 2 :(得分:0)

这是我的Swift 4解决方案,因为我遇到了同样的问题。

我也将文本字段添加到单元格中,表格是动态创建的,因此表格视图控制器没有对文本字段的任何直接访问权。

首先,我创建了一个协议,允许表视图控制器保存输入的单元格文本字段值的数据。

protocol SMTextFieldRowCellProtocol: class {
    var dataValues: [String: String] { get set }
    func updateDataValues(with data: [String: String])
}

在单元格的自定义类中,添加以下委托属性:

var delegate: SMTextFieldRowCellProtocol?

仍然在单元格的类中,使其符合UITextFieldDelegate,在awakeFromNib()中将文本字段的委托设置为self。

textField.delegate = self

然后在单元格的类中,添加UITextFieldDelegate的方法并使其调用updateDataValues方法。我使我的密钥等于单元格的标题标签,因此所有密钥都是唯一的。

func textFieldDidEndEditing(_ textField: UITextField) {
    delegate?.updateDataValues(with: [titleLabel.text!: textField.text!])
}

上述方法将更新表视图控制器的字典。差不多完成了,但每当你在表视图的cellForRow方法中创建行时,设置单元格的委托:

cell.delegate = self

最后,将协议添加到类中并符合它:

class SMEditProfileTVC: UITableViewController, SMTextFieldRowCellProtocol {
    var dataValues: [String: String] = [String: String]()
    func updateDataValues(with data: [String: String]) {
        for key in data.keys {
            dataValues[key] = data[key]
        }
    }
}

所以当你完成编辑单元格文本时,它会调用表视图控制器的updateDataValues方法并将数据保存到dataValue的字典中。现在,这样可以在保存等时或在视图控制器中完成时轻松传输数据。