2017-01-28 1 views
3

У меня есть UITextField. Он работает нормально, что означает, что при нажатии он запускает метод EditingDidBegin и т. Д. Проблема заключается в том, что я не могу отменить его, что означает, что клавиатура будет всегда видна, охватывая важные элементы управления. Я думал, что поведение по умолчанию будет отменять/скрывать клавиатуру, когда пользователь щелкает где-то иначе, чем UITextField, например, на пустом месте вокруг него, но это не так: UITextField все еще там. Одним из вариантов достижения такого поведения было бы добавление сенсорного прослушивателя ко всему, кроме UITextFields, и выполнять ручную расфокусировку, когда он срабатывает, но это было бы ужасным решением по очевидным причинам.Как отключить UITextFields, когда пользователь нажимает другие элементы управления/пустое пространство?

Вопрос, как я могу сфокусировать UITextFields, когда пользователь нажимает другие элементы управления/«пустое пространство»?

Предлагаемые варианты не подходят для Xamarin.iOS, который нужен мне.

+0

Вы можете добавить прозрачный вид на задней части текстового поля и добавить водопроводную жест для просмотра. Когда открывается точка просмотра, отпустите клавиатуру. –

+0

хорошо, если у меня есть кнопки на экране, они не будут нажаты. – nicks

+0

Чтобы предотвратить Gesture на кнопках или любом другом управляемом контроллере, используйте 'tapRecognizer.cancelsTouchesInView = NO;' –

ответ

2

Я всегда добавить это к моему 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) 
} 

Он уйдет в отставку свой TextField или TextView, нажав вне его.

Примечание: Это не повлияет на Scrollview

Objective C

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

В Scroll View

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

не работает для меня – nicks

+0

он уходит в отставку только в том случае, если я нажимаю его снова, а не когда я нажимаю его вне. – nicks

+0

У вас есть scrollView или просто просмотр? потому что оба метода работают как заклинание –

1

Если вы используете 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) 
} 
3

Вы можете достичь этого, используя UIGestureRecognizerDelegate.

Создайте объект UITapGestureRecognizer и добавьте его в режим просмотра контроллера. Написать ниже код в 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.

В этом методе вы можете просто проверить свой текстовый экран (в этом примере мы использовали self.textField).

И напишите условие на resignFirstResponder вашего текста.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
    if ([touch.view isEqual:self.textField]) { 
     return NO; 
    } else { 
     [self.textField resignFirstResponder]; 
     return YES; 
    } 
} 
1

Что о называя TextField-х resignFirstResponder, когда вы хотите unfocus это? Это решение, которое мы используем во многих приложениях!

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