it-swarm.com.ru

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

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

42
Sheehan Alam

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

Код:

В viewDidLoad

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

[self.view addGestureRecognizer:tap];

В dismissKeyboard:

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

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

ВАРИАНТ 2

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

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch * touch = [touches anyObject];
    if(touch.phase == UITouchPhaseBegan) {
        [aTextField resignFirstResponder];
    }
}
80
visakh7

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

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

      [[self view] endEditing:TRUE];

}

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

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

42
Taneem Tee

Добавьте tapGesture Recognizer, но убедитесь, что отменилTouchesInView = NO

UITapGestureRecognizer* tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(closeTextInput)];
tapGesture.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:tapGesture];
[tapGesture release];
16
Matt Rees

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

Код:

В viewDidLoad

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

[self.view addGestureRecognizer:tap];

В dismissKeyboard:

-(void)dismissKeyboard {
       [self.view endEditing:true];
}
2
Suresh Kansujiya

Вам нужно добавить прозрачный 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];
1
Shreesh

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

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

 self.view.addGestureRecognizer(tap)

И dismissKeyboard

@objc func dismissKeyboard() {
    self.view.endEditing(true)
}
1
Kimdv

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

Код в Swift 4

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

0
Anu Mittal

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

tableView.KeyboardDismissMode = UIScrollViewKeyboardDismissMode.OnDrag;

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

0
Adam Hockemeyer

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

Создает ваш 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 это хорошо для этого, потому что return означает выполнить действие с формой) в конструкторе интерфейса, так что вы можете нажмите 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];
}
0
rokimoki