Как я могу отклонить клавиатуру, если пользователь нажимает на экранную клавиатуру? - PullRequest
42 голосов
/ 19 апреля 2011

Я хочу иметь возможность отклонить клавиатуру iPhone, когда пользователь нажимает где-нибудь за пределами клавиатуры.Как я могу сделать это?Я знаю, что должен уволить респондента, но должен знать, как его реализовать, когда пользователь нажимает на клавиатуру

Ответы [ 9 ]

80 голосов
/ 19 апреля 2011

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

код:

В viewDidLoad

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                      action:@selector(dismissKeyboard)];

[self.view addGestureRecognizer:tap];

В dismissKeyboard:

-(void)dismissKeyboard {
       [aTextField resignFirstResponder];
}

(где aTextField - текстовое поле, отвечающее за клавиатуру)

ВАРИАНТ 2

Если вы не можете позволить себе добавить жест-распознаватель, попробуйте это

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch * touch = [touches anyObject];
    if(touch.phase == UITouchPhaseBegan) {
        [aTextField resignFirstResponder];
    }
}
42 голосов
/ 30 апреля 2011

Самое простое решение, которое я использовал, это:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

      [[self view] endEditing:TRUE];

}

Команда endEditing может использоваться в любом представлении, которое содержит ваше текстовое поле в качестве подпредставления. Другое преимущество этого метода заключается в том, что вам не нужно знать, какое текстовое поле вызывает клавиатуру. Поэтому, даже если у вас есть несколько текстовых полей, просто добавьте эту строку в суперпредставление.

Основываясь на документации Apple, я думаю, что этот метод существует специально для решения этой проблемы.

16 голосов
/ 21 июня 2012

Добавьте устройство распознавания жестов, но убедитесь, что отменяет TouchInView = NO

UITapGestureRecognizer* tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(closeTextInput)];
tapGesture.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:tapGesture];
[tapGesture release];
2 голосов
/ 30 января 2017

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

код:

InDidLoad

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                      action:@selector(dismissKeyboard)];

[self.view addGestureRecognizer:tap];

В dismissKeyboard:

-(void)dismissKeyboard {
       [self.view endEditing:true];
}
1 голос
/ 16 октября 2017

Это решение Swift 4:

 let tap = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard))

 self.view.addGestureRecognizer(tap)

И dismissKeyboard

@objc func dismissKeyboard() {
    self.view.endEditing(true)
}
1 голос
/ 19 апреля 2011

Вам нужно добавить прозрачный UIVIew в качестве подпредставления под клавиатурой и прикоснуться к нему там, чтобы закрыть клавиатуру.Ниже код для вашей справки.

UITapGestureRecognizer* gesture = [[UITapGestureRecognizer alloc]   initWithTarget:self action:@selector(overlayTouched:)]; 
gesture.delegate = self;
[(UITapGestureRecognizer *)gesture setNumberOfTouchesRequired:1];

UIView* trans = [[UIView alloc] initWithFrame:[[delegate view] bounds]];
[trans setOpaque:NO];
[trans setAutoresizingMask:UIViewAutoresizingFlexibleWidth |    UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin];
[trans setAlpha:0.3];
[trans setUserInteractionEnabled:YES];
trans.multipleTouchEnabled = YES;
[trans addGestureRecognizer:gesture];
[trans setBackgroundColor:[UIColor blackColor]];
[trans setTag:BLACK_SCREEN_VIEW];
0 голосов
/ 26 марта 2019

Если вы не хотите добавлять распознаватель жестов, вы также можете использовать метод touchesBegin

Код в Swift 4

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { view.endEditing(true) }

0 голосов
/ 20 июля 2016

Если вы используете UITableViewController или имеете UITableView, с которым пользователь будет взаимодействовать, в вашем ViewDidLoad вы можете просто сделать:

tableView.KeyboardDismissMode = UIScrollViewKeyboardDismissMode.OnDrag;

Примечание: это синтаксис Xamarin.iOS.

0 голосов
/ 31 января 2013

Другой способ сделать это прост:

Делает ваш UIView as UIControl in custom class in the interface builder, затем вы можете прикрепить метод IBAction в Touch up inside event вашего UIView : UIControl, затем вы помещаете [yourTextField resignFirstResponder] внутри IBAction method, вот так:

- (IBAction) hideKeyboard: (id) sender
{
    // If you have more than one textfield to dismiss, of course only can be active 1, but here you can't know who is it, because sender will be the UIView : UIControl
    [alias resignFirstResponder];
    [password resignFirstResponder];
}

Затем, у вас есть другой вариант, и он должен вставить в текстовое поле the return key of the keyboard as Done (Это может быть любой из тех, что вы хотите, но Готово, это хорошо для этого, потому что возвратозначает выполнить действие с формой) в конструкторе интерфейса, чтобы вы могли нажать Done и скрыть клавиатуру, но в этом случае вам необходимо присоединить предыдущий метод IBAction к событию Did end on exit.

И таким образом клавиатура будет скрывать touching outside или касаться Done с клавиатуры.

Если вы хотите улучшить код, если только будете скрывать клавиатуру, касающуюся Done от клавиатуры, методдолжно быть:

// Attach all textFields here on Did end on exit event, will not work if touch outside the keyboard
- (IBAction) hideKeyboard: (id) sender
{
      [sender resignFirstResponder];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...