当用户按下其他控件/空格时,如何取消对UITextField的聚焦?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当用户按下其他控件/空格时,如何取消对UITextField的聚焦?相关的知识,希望对你有一定的参考价值。
我有一个UITextField
。它正常工作,这意味着当按下时,它会触发EditingDidBegin
方法等。问题是我无法取消选择它,这意味着键盘将始终可见,覆盖重要控件。我认为默认行为是当用户点击与UITextField
不同的地方时取消选择/隐藏键盘,例如在它周围的空白区域,但事实并非如此 - UITextField
仍在那里。实现此行为的一个选择是在UITextFields
以外的所有内容中添加触摸侦听器,并在触发时执行手动非聚焦,但出于明显的原因,这将是一个可怕的解决方案。
问题是,当用户按下其他控件/“空白区域”时,如何解散
UITextFields
?
提议的选项不适用于我需要的Xamarin.ios。
我总是将它添加到我的ViewController中
override func viewDidLoad()
{
super.viewDidLoad()
// other stuff
// but to stop editing when the user taps anywhere on the view, add this gesture recogniser
let tapGestureBackground = UITapGestureRecognizer(target: self, action: #selector(self.backgroundTapped(_:)))
self.view.addGestureRecognizer(tapGestureBackground)
}
func backgroundTapped(_ sender: UITapGestureRecognizer)
{
self.endEditing(true)
}
迅速
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
目标C.
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[self.view endEditing:YES];
}
它将通过点击外部来重新签名textField或textView。
注意:它不会影响scrollView
在滚动视图中
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
tapGesture.cancelsTouchesInView = NO;
[yourScrollView/TableView addGestureRecognizer:tapGesture];
-(void)hideKeyboard {
[textFieldInYourScrollView/TableView resignFirstResponder];
}
你可以通过使用UIGestureRecognizerDelegate
实现这一目标。
创建UITapGestureRecognizer
对象并将其添加到控制器视图。在viewDidLoad
方法中写下面的代码
- (void) viewDidLoad {
[super viewDidLoad];
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] init];
tapRecognizer.delegate = self;
[self.view addGestureRecognizer:tapRecognizer];
}
不要忘记用qazxsw poi扩展你的控制器。
UIGestureRecognizerDelegate
现在实现委托方法@interface YourViewController () <UIGestureRecognizerDelegate>
@property (nonatomic, weak) IBOutlet UITextField *textField;
@end
它是- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;
的委托方法。
在这个方法中,你可以简单地检查你的textField(在这个例子中我们使用了UITapGestureRecognizer
)。
并为你的textField的self.textField
写一个条件。
resignFirstResponder
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if ([touch.view isEqual:self.textField]) {
return NO;
} else {
[self.textField resignFirstResponder];
return YES;
}
}
在您的ViewController中
public class MyUIView : UIView
{
//ctor..
public override UIView HitTest(CGPoint point, UIEvent uievent)
{
var res = base.HitTest(point, uievent);
if (res == null || !(res.GetType().IsSubclassOf(typeof(UITextField)) || res.GetType() == typeof(UITextField)))
{
this.EndEditing(false);
}
return res;
}
}
如果您使用UITableViewCell,您可以根据您的要求设置其中一个属性来隐藏键盘: -
public override void LoadView()
{
View = new MyUIView();
}
如果你正在使用普通的UIViewController视图,你只需在viewDidLoad()中添加一个UITapGestureRecognizer: -
tableView.keyboardDismissMode = .onDrag
tableView.keyboardDismissMode = .interactive
并在你的UIViewController中定义它的动作函数,如: -
let gesture = UITapGestureRecognizer()
gesture.addTarget(self, action: #selector(self.hideKeyBoard(sender:)))
什么是关于调用textField的func hideKeyBoard(sender : UITapGestureRecognizer){
self.view.endEditing(true)
}
什么时候你想要解决它?这是我们在许多应用程序中使用的解决方案!
以上是关于当用户按下其他控件/空格时,如何取消对UITextField的聚焦?的主要内容,如果未能解决你的问题,请参考以下文章
如何取消选择 DataGridView 控件中的所有选定行?