辞职文本字段 - 代码重用

时间:2014-10-30 18:57:21

标签: ios objective-c uitextfield

当用户点击屏幕上的任意位置时,我想重复使用代码来解除文本字段。我试图遵循单一责任原则,因此将此功能放在超类中并从中继承似乎不是一个好主意。

以下是我目前的情况:

TextFieldResigner.m:

@implementation TextFieldResigner

+ (void)autoDismissTextFieldsFromViewController:(UIViewController *)viewController {
    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:viewController action:@selector(resignOnTap)];
    [singleTap setNumberOfTapsRequired:1];
    [singleTap setNumberOfTouchesRequired:1];
    [viewController.view addGestureRecognizer:singleTap];
}

@end

我的视图控制器类:

@interface EnrollQuestionsViewController ()

@end

@implementation EnrollQuestionsViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [TextFieldResigner autoDismissTextFieldsFromViewController:self];
}

- (void)resignOnTap {
    [_myTextField resignFirstResponder];
}

@end

这个解决方案并不觉得它整齐地融合在一起。尝试完成此任务的更正确的方法是什么?

1 个答案:

答案 0 :(得分:1)

此解决方案非常容易出错。您正在接受类UIViewController的对象,然后期望它们具有自定义resignOnTap选择器。

顺便提一下,您的autoDismissTextFieldsFromViewController:选择器具有误导性;它正在注册UIGestureRecognizers最终会自动关闭文本字段。它的名称表明它本身就会解雇文本字段。

becomeFirstResponder返回YES的对象上调用canBecomeFirstResponder将自动resignFirstResponder点击前一个第一响应者。您可以将其放在viewDidLoad

[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(becomeFirstResponder)]];

并将其添加到视图控制器:

- (BOOL)canBecomeFirstResponder {
  return YES;
}

使用UITapGestureRecognizer为您完成此项工作时,您必须注意。如果您在屏幕上显示其他UITapGestureRecognizer,则可能会导致您的点击不会触发,具体取决于您的UIGestureRecognizerDelegate实施(如果有)。