Как отклонить клавиатуру цифровой клавиатуры, нажав в любом месте - программирование
Подтвердить что ты не робот

Как отклонить клавиатуру цифровой клавиатуры, нажав в любом месте

Я хотел бы узнать простейший код, чтобы отклонить клавиатуру с цифровым клавиатурой, когда вы нажимаете куда-либо вне цифровой клавиатуры. Это простое приложение для ввода числа внутри текстового поля, а затем пользователь может отменить клавиатуру после того, как пользователь закончит вводить цифры в текстовом поле. Благодарю!:)

4b9b3361

Ответ 1

Объявление текстового поля как переменной экземпляра или свойства, если оно еще не реализовано и реализует простой способ:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
    [textField resignFirstResponder];
}

будет прекрасно.

Ответ 2

Попробуйте этот метод,

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

Теперь нажмите в любом месте и увидите, что клавиатура будет отключена.: -)

Ответ 3

Для быстрого использования кода ниже

override func touchesBegan(touches: NSSet, withEvent event: UIEvent)
 {
       textFiled.resignFirstResponder()
 }

Ознакомьтесь с последним обновлением после Ссылка

Ответ 4

Прикосновение к фону для закрытия клавиатуры

Перейдите к Xcode, если вы еще этого не сделали. Нам нужно добавить еще одно действие в наш класс контроллера. Добавьте следующую строку в файл Control_FunViewController.h:

#import <UIKit/UIKit.h>
@interface Control_FunViewController : UIViewController { 
UITextField *nameField;
UITextField *numberField;
}
 @property (nonatomic, retain) IBOutlet UITextField *nameField; ]
@property (nonatomic, retain) IBOutlet UITextField *numberField; 
- (IBAction)textFieldDoneEditing:(id)sender; 
- (IBAction)backgroundTap:(id)sender; 
@end  

Сохранить файл заголовка; перейдите к файлу реализации и добавьте этот код, который просто сообщает обе текстовым полям, чтобы получить статус первого ответчика, если он у него есть. Совершенно безопасно вызывать resignFirstResponder на элементе управления, который не является первым ответчиком, поэтому мы можем безопасно называть его в обоих текстовых полях, не проверяя, является ли он первым ответчиком.

- (IBAction)backgroundTap:(id)sender { 
[nameField resignFirstResponder]; 
[numberField resignFirstResponder];
}

TIP Сохраните этот файл и вернитесь в Interface Builder. Теперь нам нужно изменить базовый класс представления nibs. Если вы посмотрите на главное окно nibs, вы увидите, что в этом представлении есть три значка. Третий, называемый View, является основным представлением nibs, который содержит все остальные элементы управления и представления в качестве подзонов. Нажмите один раз значок "Вид", который представляет собой представление контейнера nibs. Нажмите ␣4, чтобы вызвать инспектор идентификации. Здесь мы можем изменить базовый класс любого экземпляра объекта в Interface Builder.

Вы будете многократно переключаться между файлами заголовка и реализацией при кодировании. К счастью, Xcode имеет комбинацию клавиш, которая быстро переключит вас между этими файлами. Комбинация клавиш по умолчанию - ␣␣␣ (опция-команда-стрелка), хотя вы можете изменить ее на все, что хотите, с помощью предпочтений Xcodes.76

В поле с надписью Class в настоящее время указано UIView. Измените его, чтобы прочитать UIControl. Все элементы управления, способные запускать методы действий, являются подклассами UIControl, поэтому, изменяя базовый класс, мы просто дали этому представлению возможность запускать методы действий. Вы можете проверить это, нажав ␣2, чтобы вызвать инспектора соединений.

Перетащите из события Touch Down на значок "Владелец файлов" и выберите действие backgroundTap:. Теперь, касание в любом месте представления без активного элемента управления вызовет наш новый метод действия, который заставит клавиатуру отступить.

Примечание Сохраните наконечник и вернитесь назад и попробуйте. Скомпилируйте и запустите приложение снова. На этот раз клавиатура должна исчезнуть не только тогда, когда нажата кнопка "Готово", но и когда вы нажимаете в любом месте, где нет активного элемента управления, и это поведение, которое ваш пользователь будет ожидать.

Ответ 5

Я попытался реализовать некоторые из решений здесь и обнаружил, что с ними были некоторые проблемы. Примечательно, что My UIView содержит UIScrollView, который, как представляется, перехватывает штрихи.

Когда это не удалось, я подумал, что "прослушивание в любом месте" - это немного неопределенное поведение, требующее от пользователя угадать, как убрать клавиатуру, а не давать им четкие указания.

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

Я понимаю, что это не то, что OP специально запрашивает, но я считаю, что это лучшее решение, чем запрос "коснуться куда угодно" (и его легко реализовать!).

Следующий код называется частью -viewDidLoad в моем UIViewController.

// My app is restricted to portrait-only, so the following works
UIToolbar *numberPadAccessoryInputView      = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 44.0f)];

// My app-wide tint color is a gold-ish color, so darkGray contrasts nicely
numberPadAccessoryInputView.barTintColor    = [UIColor darkGrayColor];

// A basic "Done" button, that calls [self.textField resignFirstResponder]
UIBarButtonItem *numberPadDoneButton        = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self.textField action:@selector(resignFirstResponder)];

// It the only item in the UIToolbar items array
numberPadAccessoryInputView.items           = @[numberPadDoneButton];

// In case the background of the view is similar to [UIColor darkGrayColor], this
// is put as a contrasting edge line at the top of the UIToolbar
UIView *topBorderView                       = [[UIView alloc] initWithFrame:CGRectMake(0, 0, numberPadAccessoryInputView.frame.size.width, 1.0f)];
topBorderView.backgroundColor               = [UIColor whiteColor];
[numberPadAccessoryInputView addSubview:topBorderView];

// Make it so that this UITextField shows the UIToolbar
self.textField.inputAccessoryView           = numberPadAccessoryInputView;

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

Я по-прежнему полагаю, что Apple должна предоставить кнопку "Готово" для этой клавиатуры (например, ссылку, размещенную Janak Nirmal), но это самое элегантное решение, отличное от Apple.

Ответ 6

Для достижения этой цели вы должны использовать UITapGestureRecognizer.

UITapGestureRecognizer *tapToDismiss = [[UITapGestureRecognizer alloc]initWithTarget: self action: @selector (dismissNumberKeyBoard:)];

Затем в вашем методе rejectNumberKeyboard

-(Void)dismissNumberKeyboard : (id)sender {

   [yourTextField resignFirstResponder];

}

Счастливое кодирование!

Ответ 7

Просто создайте простую функцию, подобную этой.

    -(IBAction)hideKeyboard:(id)Sender
{
    [_textValue resignFirstResponder];
}

теперь перейдите к файлу ur nib и подключите эту функцию с текстовым полем с помощью didEndOnExit, и вам хорошо идти. Теперь, когда u выберет внешнее текстовое поле ur, клавиатура скроется.

Ответ 8

Вы можете отлично реализовать ответ @mbm, поместив didSet на розетку и добавив туда свой входной доступ:

Быстрый код:

  @IBOutlet var input: UITextField! { didSet {
    let toolbar = UIToolbar(frame: CGRect(origin: CGPoint.zero, size: CGSize(width: 0, height: 44)))
    toolbar.items = [
      UIBarButtonItem(barButtonSystemItem: .done, target: self.input,
        action: #selector(resignFirstResponder))
    ]
    input.inputAccessoryView = toolbar
  }}

В xcode 8/iOS 10 В результате он выглядит примерно так:

введите описание изображения здесь

Ответ 9

Обычно, когда пользователь прикасается к кнопке "Отмена", я использую это, чтобы отменить клавиатуру -

- (void)searchBarCancelButtonClicked:(UISearchBar *) searchBar
{
    NSLog(@"cancel clicked");
    [searchBar resignFirstResponder]; // dismiss keyboard
    return;
}

Если вы хотите сделать это, когда пользователь прикасается где-нибудь за пределами области клавиатуры, вам нужно реализовать touchesEnded и поместить туда этот код -

/* Delegate for when touch ends.  */
-(void)touchesEnded:(NSSet *)touches 
          withEvent:(UIEvent *)event
{
    [searchBar resignFirstResponder];
}

Я сам этого не пробовал, но я считаю, что это должно сделать трюк...

Ответ 10

Мне пришлось реализовать аналогичный UX для моего UITableView (внутри которого появляется UITextField). Сначала добавьте UITapGestureRecognizer в tableView. Это начнет захватывать все краны, которые происходят с этого момента.

UITapGestureRecognizer* tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
        [self.tableView addGestureRecognizer:tapGestureRecognizer];
        [tapGestureRecognizer release];

Однако побочный эффект заключается в том, что вы не хотите отклонять клавиатуру, когда пользователь нажимает на UITextField. Итак, этот случай нужно различать.

Реализация метода handleTap выглядит примерно так:

/*
 In the text editing mode, listens to all taps occurring on the table view to exit the mode. There are two special cases to consider:
 a) Text field clear button
 b) Text field
 */
-(void)handleTap:(UITapGestureRecognizer*)tapRecognizer 
{
    if(tapRecognizer.state == UIGestureRecognizerStateEnded) 
    {

            //Figure out where the user tapped
            CGPoint p = [tapRecognizer locationInView:textField];
            CGRect textFieldBounds = textField.bounds;
            CGRect clearButtonBounds = CGRectMake(textFieldBounds.origin.x + textFieldBounds.size.width - 44, textFieldBounds.origin.y, 44, textFieldBounds.size.height); 

            if(CGRectContainsPoint(clearButtonBounds, p))
                textField.text = @"";

            if(CGRectContainsPoint(textFieldBounds, p))
                return;

        [textField resignFirstResponder];
        //remove the tap gesture recognizer that was added.
        for(id element in self.tableView.gestureRecognizers)
        {
        if([element isKindOfClass:[UITapGestureRecognizer class]])
        {
            [self.tableView removeGestureRecognizer:element];
        }
        }
    }
        [self commitNewText];
    }
}

НТН. Отметьте это как ответ, если вам это нравится.

-Akshay

Ответ 11

Если вы создали пользовательскую цифровую панель или другое popover, другим решением будет использование распознавателя жестов в init вашего UIView следующим образом:

tapper = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
tapper.cancelsTouchesInView = NO;
[self addGestureRecognizer:tapper];

 _yourViewController = [[CustomViewController alloc] init];
_yourPopoverController = [[UIPopoverController alloc] initWithContentViewController:_yourViewController];
_yourPopoverController.popoverContentSize = CGSizeMake(550, 300);
_yourViewController.delegate = self;

И дескриптор handleSingleTap отклоняет popover, если видимый, и отклоняет редактирование:

- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
    if ([_yourPopoverController isPopoverVisible]) {
        [_yourPopoverController dismissPopoverAnimated:YES];
    }

    [self endEditing:YES];
}

Ответ 12

В xcode 5 Используйте признак распознавания жесткости и объявите в .h с действием, выберите имя и в .m

- (IBAction)backgroundTap:(id)sender {
    [self.view endEditing: YES];
}

Ответ 13

Здесь много ответов, но все же пришлось бороться с этим, используя XCode 5. Прочитай это: https://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/GestureRecognizer_basics/GestureRecognizer_basics.html

Добавьте в свой UIScrollView атрибут распознавания жеста. Задайте его делегатом как viewcontroller.

Добавьте этот метод:

- (IBAction)tappedSomewhere:(id)sender {
    [self.view endEditing:YES];
}

к вашему коду реализации UIScrollView и связать его с Recognizer Tap Gesture, щелкнув элемент управления и перетащив его в код реализации.

Работал для меня.

Ответ 14

Для Swift самая легкая для отбрасывания клавиатуры для всех текстовых полей путем нажатия в любом месте вне текстового поля:

override func touchesBegan(touches: NSSet, withEvent event: UIEvent)
{
    self.view.endEditing(true)
}

Ответ 15

Для быстрого 3/4 мне нравится этот случай:

  • View Controller - это подкласс для UITextFieldDelegate
  • В функции viewDidLoad вы должны установить yourPhonePadField.delegate = self
  • И переопределить эту функцию:

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