11

所以我环顾四周,这里似乎没有任何东西可以准确地解释这样做的正确方法。我在自定义 UITableViewCell 中有 7 个 UITextField。

我的问题是:管理这些 UITextFields 的代表的正确方法是什么?

由于自定义单元格在技术上是项目“模型”部分的一部分,我宁愿让控制 UITableView 的控制器也控制表格单元格中的文本字段,但我不知道如何为文本字段(在 UITableViewCell 的子类中创建)到此视图控制器。

只使 UITableViewCell 的子类符合 UITextField 委托并管理其中的所有内容是不好的做法吗?如果是这样,我还应该怎么做呢?

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

4

5 回答 5

16

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

这是你需要做的:

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;
}
于 2012-07-17T08:52:46.890 回答
7

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

通过这种方式,单元仍然可以是通用的,而无需了解应用程序实际在做什么。

于 2012-07-17T01:08:28.373 回答
0

我的建议是用一个值对每个 textField 进行“标记”(即设置标记),该值对表中的部分、行和 7 个文本视图之一进行编码,然后将 UIViewController 设为委托。

所以你需要限制这些的大小——比如你永远不会有超过 100 行。因此,您将其编码为:

.tag = 1000*section + 100*row +

当您收到一条消息时,您可以让一个方法/函数获取标签并将其解码为部分、行、标签,然后执行您需要完成的操作。

于 2012-07-16T23:49:54.730 回答
0

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

@interface MyTableViewController : UITableViewController <UITextFieldDelegate>

然后,通过 ctrl 拖动@interface. 每个 UITextField 都通过 IBOutlet 连接到其各自的属性。最后,在 .m 文件中包含以下函数以向委托人显示您要返回的字段...。

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [aTextField resignFirstResponder];
    return YES;
}
于 2012-07-16T23:52:59.057 回答
0

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;
    ....
}
于 2015-09-01T14:19:23.317 回答