pipe理自定义UITableViewCell中的UITextField的委托

所以我四处看了一下,这里没有任何东西可以解释这种做法的正确方法。 我有一个自定义的UITableViewCell中的7个UITextFields。

我的问题是这样的:什么是正确的方式来pipe理这些UITextFields的委托?

由于自定义单元格在技术上是项目“模型”部分的一部分,我宁愿控制UITableView的控制器也控制表格单元格中的文本字段,但我无法弄清楚如何设置委托文本字段(在UITableViewCell的子类中创build)到此视图控制器。

只是让UITableViewCell的子类符合UITextField委托并pipe理那里的所有东西是不好的做法? 如果是这样,我该怎么办呢?

谢谢,任何帮助,将不胜感激。

你不应该有一个问题设置单元格的文本字段的委托为您的视图控制器。

这是你需要做的:

1)视图控制器需要实现UITextFieldDelegate协议

2)声明你的自定义单元格中的文本字段的属性

 @property (nonatomic, retain) IBOutlet UITextField *textField; 

3)然后将视图控制器设置为方法cellForRowAtIndexPath的文本字段的委托

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellIdentifier = @"Cell"; MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if (cell == nil) { // use this if you created your cell with IB cell = [[[NSBundle mainBundle] loadNibNamed:@"MyCustomCell" owner:self options:nil] objectAtIndex:0]; // otherwise use this cell = [[[MyCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; // now set the view controller as the text field delegate cell.textField.delegate = self; } // configure cell... return cell; } 

在我看来,单元格应该pipe理键盘,因为它是持有UITextField的那个。 您可以将您的单元格设置为UITextField委托。 在我自己的应用程序中,我已经完成了这个工作,然后让我的单元拥有自己的代理。 UITextField的任何方法或应由控制器处理的任何新方法都可以通过单元委托传递给控制器​​。

通过这种方式,单元格仍然可以是通用的,而不知道应用程序实际正在做什么。

我的build议是将每个textField的“标记”(即设置标记)的值编码表中的部分,行和七个文本视图中的一个,然后使UIViewController成为委托。

所以你需要限制这些尺寸 – 比如你永远不会超过100行。 所以你把它编码为:

.tag = 1000 * section + 100 * row +

当你得到一个消息,你可以有一个方法/函数采取标签,并解码为部分,行,标签,并做你需要做的。

要声明TableViewController作为委托,在TableViewController的.h文件的@interface的末尾包含<UITextFieldDelegate>

 @interface MyTableViewController : UITableViewController <UITextFieldDelegate> 

然后,通过按住拖动@interface下的每个字段来连接文本字段。 每个UITextField通过一个IBOutlet连接到其各自的属性。 最后,在.m文件中包含以下函数来显示委托您想要返回哪个字段….

 - (BOOL)textFieldShouldReturn:(UITextField *)textField { [aTextField resignFirstResponder]; return YES; } 

Swift版本(基于Eyal的答案)

 class MyViewController: UIViewController, ... , UITextFieldDelegate { @IBOutlet var activeTextField: UITextField! //doesn't need to connect to the outlet of textfield in storyboard .... func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { .... var cellTextField = self.view.viewWithTag(101) as? UITextField cellTextField!.delegate = self; .... }