访问嵌入在单元格中的 textField
Posted
技术标签:
【中文标题】访问嵌入在单元格中的 textField【英文标题】:Accessing textField embedded in cell 【发布时间】:2012-12-24 04:06:58 【问题描述】:我创建了一个表格,该表格可以动态创建自定义为包含文本字段的单元格。当我运行程序时,我可以在 textFields 中输入文本。但是,在退出程序/切换到不同的视图控制器之前,我无法收集输入到其中的文本。您能否建议我应该怎么做才能提取用户输入的文本。
我了解我可以使用以下代码访问单元格...
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。但我正在寻找更清洁的解决方案。
谢谢!
【问题讨论】:
您是否尝试过在自定义单元格类中使用 @ 属性使用 getter setter 来制作文本字段,并使用 tempcell.yourtextfield.text 访问这些内容。 【参考方案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;
【讨论】:
当文本字段存在于单元格类中时,如何将文本字段委托设置为 self?单元类无法访问接口,因为它在 UIViewController 中,而不是在单元类中。 @JozemiteApps 这就是为什么我建议让视图控制器成为文本字段的代表...... 你的意思是:cell.myNewTextField.delegate = self
since 控制器中不存在文本字段。【参考方案2】:
This 教程对我很有帮助。你可以通过标签引用任何你需要的对象。
在情节提要中拖动 UIImageView
或 UITextField
等并将标签设置为 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;
【讨论】:
【参考方案3】:这是我的 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
的字典中。现在,这将使数据在保存等时或在视图控制器中完成时更容易传输。
【讨论】:
以上是关于访问嵌入在单元格中的 textField的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Shiny 的 rhandsontable 单元格中嵌入模态