我在Google上的UITableView中触摸了一个空白区域时,我搜索了如何解除键盘问题,并且有几种方法可以解决这个问题。就像使用委托,UITapGestureRecognizer,- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
和- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
一样。
我决定通过继承相应的UIView类来获取hitTest并覆盖此方法,如下所示:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
UIView *result = [super hitTest:point withEvent:event];
[self endEditing:YES];
return result;
}
这确实有效,当我触摸/滚动/滑动/捏合......在其他地方时会解除虚拟键盘,但会出现另一个问题。
当我触摸一个UITextField对象时,键盘处于活动状态或显示,然后我触摸相同的UITextField对象,这是问题,键盘试图解除但不完全,在它开始出现的某个地方的中间,做这种奇怪的动画。在我们的APP中大多数情况下,当我们触摸相同的UITextField对象时,键盘应保持静止。有没有一种简单明了的方法来解决这个问题?
解决:
最后,我自己弄清楚了。感谢@Wain,感谢@Wain的暗示。在调用result
之前,我会检查[self endEditing:YES];
。这是修改后的代码:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
UIView *result = [super hitTest:point withEvent:event];
// You can change the following condition to meet your own needs
if (![result isMemberOfClass:[UITextField class]] && ![result isMemberOfClass:[UITextView class]]) {
[self endEditing:YES];
}
return result;
}
答案 0 :(得分:0)
检查class
的{{1}},以便在结束编辑时限制。如果命中目标是可编辑的类(如文本字段或开关),则不要结束编辑会话。
答案 1 :(得分:0)
根据@iBCode答案,如果我多次选择相同的文本字段,则键盘会自动隐藏并立即显示,以避免我又添加了一个条件并在下面的语言中添加了代码
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
if let resultView = super.hitTest(point, with: event) {
if resultView.isMember(of: UITextField.self) ||
resultView.isKind(of: UITextField.self) ||
resultView.isMember(of: UITextView.self) ||
resultView.isKind(of: UITextView.self) {
return resultView
}
if !resultView.isMember(of: UITextField.self) && !resultView.isMember(of: UITextView.self) {
endEditing(true)
}
return resultView
}
return nil
}