当用户按下其他控件/空格时,如何使UITextFields不重定位?

我有一个UITextField 。 它正常工作,这意味着当按下时,它会触发EditingDidBegin方法等。问题是,我EditingDidBegin它,这意味着键盘将始终可见,覆盖重要的控制。 我认为当用户点击与UITextField不同的地方时,默认行为是取消select/隐藏键盘,例如在它周围的空白区域,但不是 – UITextField仍然存在。 实现这种行为的一个select是将触摸监听器添加到UITextFields以外的任何位置,并在触发时执行手动非聚焦,但是出于显而易见的原因,这将是一个可怕的解决scheme。

问题是,当用户按下其他控件/“空格”时,我如何不重定位UITextFields

build议的选项不适用于我需要的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) } 

它会通过点击它的外部来放弃你的textField或textView。

注意:这不会影响scrollView

目标C

 -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [self.view endEditing:YES]; } 

在滚动视图

 UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)]; // prevents the scroll view from swallowing up the touch event of child buttons tapGesture.cancelsTouchesInView = NO; [yourScrollView/TableView addGestureRecognizer:tapGesture]; // method to hide keyboard when user taps on a scrollview -(void)hideKeyboard { [textFieldInYourScrollView/TableView resignFirstResponder]; } 

你可以通过使用UIGestureRecognizerDelegate实现这一点。

创buildUITapGestureRecognizer对象并将其添加到控制器视图。 在viewDidLoad方法中写下面的代码

 - (void) viewDidLoad { [super viewDidLoad]; UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] init]; tapRecognizer.delegate = self; [self.view addGestureRecognizer:tapRecognizer]; } 

不要忘记用UIGestureRecognizerDelegate扩展你的控制器。

 @interface YourViewController () <UIGestureRecognizerDelegate> @property (nonatomic, weak) IBOutlet UITextField *textField; @end 

现在实现委托方法- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch; 它是UITapGestureRecognizer的委托方法。

在这个方法中,你可以简单地检查你的textField(在这个例子中我们使用了self.textField )。

并写一个条件resignFirstResponder你的textField。

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { if ([touch.view isEqual:self.textField]) { return NO; } else { [self.textField resignFirstResponder]; return YES; } } 
 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; } } 

在你的ViewController

  public override void LoadView() { View = new MyUIView(); } 

如果您使用UITableViewCell,则可以根据您的要求设置其中一个属性来隐藏键盘: –

 tableView.keyboardDismissMode = .onDrag tableView.keyboardDismissMode = .interactive 

如果你正在使用正常的UIViewController视图,你可以简单地添加一个UITapGestureRecognizer在viewDidLoad()中: –

 let gesture = UITapGestureRecognizer() gesture.addTarget(self, action: #selector(self.hideKeyBoard(sender:))) 

在你的UIViewController中定义它的动作函数,如下所示:

 func hideKeyBoard(sender : UITapGestureRecognizer){ self.view.endEditing(true) } 

当你想要放松它时,怎么样调用textField的resignFirstResponder ? 这是我们在许多应用程序中使用的解决scheme!