当用户按下其他控件/空格时,如何取消对UITextField的聚焦?

问题描述 投票:3回答:6

我有一个UITextField。它正常工作,这意味着当按下时,它会触发EditingDidBegin方法等。问题是我无法取消选择它,这意味着键盘将始终可见,覆盖重要控件。我认为默认行为是当用户点击与UITextField不同的地方时取消选择/隐藏键盘,例如在它周围的空白区域,但事实并非如此 - UITextField仍在那里。实现此行为的一个选择是在UITextFields以外的所有内容中添加触摸侦听器,并在触发时执行手动非聚焦,但出于明显的原因,这将是一个可怕的解决方案。

问题是,当用户按下其他控件/“空白区域”时,如何解散UITextFields

提议的选项不适用于我需要的Xamarin.iOS。

ios objective-c swift xamarin xamarin.ios
6个回答
4
投票

我总是将它添加到我的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)   
}

6
投票

迅速

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];
}

3
投票

你可以通过使用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

3
投票
- (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;
    }
}

1
投票

如果您使用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:)))

1
投票

什么是关于调用textField的func hideKeyBoard(sender : UITapGestureRecognizer){ self.view.endEditing(true) } 什么时候你想要解决它?这是我们在许多应用程序中使用的解决方案!

© www.soinside.com 2019 - 2024. All rights reserved.