如何在UITableViewCell firstResponder中优雅地制作UITextField?

时间:2015-07-28 19:52:51

标签: objective-c uitableview uitextfield

我的UITableView有几行,可能包含UITextField个。我为这个UITableViewCell创建了一个自定义类。这个自定义类有一个委托,如下所示:

@interface GKCustomCell : UITableViewCell <UITextFieldDelegate>
@property (nonatomic, strong) UITextField *textField;
@property (nonatomic, strong) id<UITextFieldDelegate> delegate;
@end

我的TableViewController符合<UITextFieldDelegate>协议,因此我可以在-tableView:cellForRowAtIndexPath:中指定自己:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    GKCustomCell *cell = (GKCustomCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    cell.delegate = self;
    ...
    return cell;
}

单元格的方法直接称它为代理的相应方法,如下所示:

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    [self.delegate textFieldDidEndEditing:textField];
}

所以我已经知道如何在我的控制器中的单元格中正确访问UITextField个事件。

我的问题是,我想通过某种逻辑选择文本字段(使它们成为firstResponder)(例如,按下Done in one one中的下一个)。为此,我显然需要一个参考单元格中的UITextField,这个参考文献并不具备(因为行是动态的,所以我无法提供强大的参考资料)在我的表中查看控制器到单元格的内部对象中。

如何优雅地访问其中一个UITextField

2 个答案:

答案 0 :(得分:0)

使用自定义块。在cell.h中定义一个块,如下面的那样 -

typedef void (^textField_block_t)(UITextField * txtField);

然后创建一个相同的实例,如下所示 -

@property (copy) textField_block_t txtFieldBlock;

在cell.m中,无论你想要将文本字段传递给TableViewController类的任何事件,都要调用块如下 -

if ([self txtFieldBlock])
{
    [self txtFieldBlock]([self textField]);
}

在TableviewController的cellForRowAtIndexPath中,您需要将此块设置为 -

GKCustomCell *cell = (GKCustomCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
 [cell setTxtFieldBlock:^(UITextField * txtField){
   //Here you will be getting your instance of textfield which belongs to that particular cell. Do whatever you want to do with it.

  }];

答案 1 :(得分:0)

您可以先在storyborad或代码中设置textField.userInteractionEnabled = No,以便在tableView上获取事件。  

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell  = [self.tableView cellForRowAtIndexPath:indexPath];
[cell.textField becomeFirstResponder];
}

现在您可以调用textfield委托方法 快乐的编码