我的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
?
答案 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委托方法 快乐的编码