当用户按下其他控件/空格时,如何取消对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 控件中的所有选定行?

用户按下后取消正在进行的连接

如何在ms-access vba中单击命令按钮单击以更改代码以更改控件属性

按下其他连续按钮时如何取消选择按钮?