当用户点击屏幕上的任意位置时,我想重复使用代码来解除文本字段。我试图遵循单一责任原则,因此将此功能放在超类中并从中继承似乎不是一个好主意。
以下是我目前的情况:
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
这个解决方案并不觉得它整齐地融合在一起。尝试完成此任务的更正确的方法是什么?
答案 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
实施(如果有)。