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

сегодня я попытался запустить свой код на своем iPod (iOS 6.1.3), и я нашел здесь что-то интересное...

во-первых, когда я нажимаю на текстовое поле, появляется клавиатура, но она не скроется, когда я коснуюсь другого места вне текстового поля.

поэтому я решил использовать Googling и нашел это решение:

_fieldEmail.delegate = self;
_fieldEmail.returnKeyType = UIReturnKeyDone;

_fieldPassword.delegate = self;
_fieldPassword.returnKeyType = UIReturnKeyDone;

_fieldRegisterName.delegate = self;
_fieldRegisterName.returnKeyType = UIReturnKeyDone;

_fieldRegisterEmail.delegate = self;
_fieldRegisterEmail.returnKeyType = UIReturnKeyDone;

_fieldRegisterPassword.delegate = self;
_fieldRegisterPassword.returnKeyType = UIReturnKeyDone;

он работает... он дает кнопку "DONE" внизу клавиатуры, и теперь клавиатуру можно скрыть, нажав на нее.

но у меня есть 2 проблемы:

  • клавиатура скрывается только при нажатии кнопки "DONE". не путем нажатия другой области вне текстового поля. Я не знаю, нормально ли это в мире iOS, но обычно я вижу, что многие приложения не действуют так.
  • Есть ли какой-либо способ для цикла этого процесса, поэтому я не могу вручную добавить этот делегат по одному из всего текстового поля, которое у меня есть? как это сделать?

что все, что мне нужно знать

Ответ 1

Нижеприведенный код будет работать со всеми компонентами в UIView для всех UITextField

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    for (UIView * txt in self.view.subviews){
        if ([txt isKindOfClass:[UITextField class]] && [txt isFirstResponder]) {
            [txt resignFirstResponder];
        }
    }
}

ИЛИ

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

Ответ 2

  • Просто добавьте UITapGestureRecogniser к вашему представлению, которое приведет к вызову resignFirstResponder

В viewDidLoad:

UITapGestureRecognizer * tapGesture = [[UITapGestureRecognizer alloc] 
                                   initWithTarget:self
                                   action:@selector(hideKeyBoard)];

[self.view addGestureRecognizer:tapGesture];

И затем:

-(void)hideKeyBoard {
       [yourTextField resignFirstResponder];
}

2.Вы можете подклассифицировать UITextField, но если у вас нет 1000 текстовых полей, это нормально делать, как в настоящее время.

Ответ 3

Это относится к программированию Swift для Xcode 6.0.1

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    let tapRecognizer = UITapGestureRecognizer(target: self, action: "handleSingleTap:")
    tapRecognizer.numberOfTapsRequired = 1
    self.view.addGestureRecognizer(tapRecognizer)
}

func handleSingleTap(recognizer: UITapGestureRecognizer) {
    self.view.endEditing(true)
}

Ответ 4

Использовать Либо

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
[self.view addGestureRecognizer:singleTap];

и код метода

-(void)handleSingleTap:(UITapGestureRecognizer *)sender{
    [self.TextFiledName resignFirstResponder];

}

ИЛИ _ И лучший вариант

Просто добавьте

  [self.view endEditing:YES];

И клавиатура будет скрываться, когда вы будете использовать что-либо из вида:)

Ответ 5

Отключение клавиатуры

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

Ответ 6

То, что я обычно делаю, это вызов

[field resignFirstResponder]; 

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

Ответ 7

Простой,

Используйте IQKeyboardManager и поместите эту строку кода в AppDelegate.m

[[IQKeyboardManager sharedManager] setShouldResignOnTouchOutside:YES];

Ответ 8

Вот как я это делаю:

В файле myView.h:

@property (strong) UITextField * savedTextField;

В файле myView.m:

@implementation myView

@synthesize savedTextField;

В подпрограмме myView init:

[self setSavedTextField: nil];

В области делегата myView textField я сохраняю идентификатор любого текстового поля, который в настоящий момент активируется:

- (BOOL) textFieldShouldBeginEditing: (UITextField *) textField
   {
   [self setSavedTextField: textField];
   .
   .
   .
   return( YES );
   }

И в процедуре myView, которая маршрутизирует весь трафик для других элементов управления, когда к ним обращаются, у меня есть код, который смотрит, активен ли textField и, если таковой был, он вызывает его, чтобы уйти с статуса первогоResponder и затем падает ноль в свойство savedTextField:

- (void) handleCtrlEvents: (UIControl *) aCtrl
  {
  if ( [self savedTextField] != nil )
     {
     [[self savedTextField] resignFirstResponder];
     [self setSavedTextField: nil];
     }
  .
  .
  .
  }

Это работает для меня чисто.

Ответ 9

Я столкнулся с одной и той же проблемой. Обычно вы хотите, чтобы везде, где вы нажимаете внутри своего приложения (которое отображается в вашем основном/текущем UIView), но не на клавиатуре, чтобы закрыть его. После поиска в Интернете для интеллектуального решения и тестирования нескольких я думаю, что лучше всего расширить/подкласс/реализовать UIGestureRecognizerDelegate

Так как многие элементы управления, такие как UITableView и т.д., могут реагировать на жесты (выбор, прокрутка и т.д.), и если вы просто добавляете UITapGestureRecognizer в целом (main-) ViewController, чтобы закрыть клавиатуру, пользовательский интерфейс не самый лучший, так как пользователю нужно дважды нажать, если он не намерен закрывать клавиатуру, но, например, выберите строку из UITableView внутри текущего "основного" представления приложения.

Так как я совершенно новичок во всей iOS и быстрой работе, а примеры быстрого редки, здесь мой полный контроль клавиатуры отключен:

class ViewController: UIViewController, UIGestureRecognizerDelegate {

override func viewDidLoad(){
     self.initializeCloseKeyboardTap()
}

func initializeCloseKeyboardTap() {

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "onKeyboardOpen:", name: UIKeyboardDidShowNotification, object: nil)

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "onKeyboardClose:", name: UIKeyboardDidHideNotification, object: nil)
    let tapRecognizer = UITapGestureRecognizer(target: self, action: "handleOnTapAnywhereButKeyboard:")
    tapRecognizer.delegate = self //delegate event notifications to this class
    self.view.addGestureRecognizer(tapRecognizer)

}


func onKeyboardClose(notification: NSNotification) {
    println("keyboardClosed")
}

func onKeyboardOpen(notification: NSNotification) {
    println("keyboardOpen")
}

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
    self.view.endEditing(true)
    return false
}

вы можете вложить его в ViewController и вызвать initiallizeCloseKeyboardTa() в реализации viewDidLoad... Он также реализует наблюдателя нормирования, чтобы получать события, как только открытая или закрытая клавиатура открыта или закрыта через NSNotificationCenter UIKeyboardDidShowNotification и UIKeyboardDidHideNotification

Надеюсь, что спасут других людей некоторое время: -)

Ответ 10

| * | Отключение клавиатуры UITextFields: переопределить метод touchBegan: withEvent: для ViewController

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

| ИЛИ |

override func viewDidLoad()
{
    super.viewDidLoad()
// For tapping outside text box
    self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(DismisKeyPadFnc)))
}

// For tapping outside text box
func DismisKeyPadFnc()
{
    view.endEditing(true)
}

| * | Отключение клавиатуры UITextFields в induvidual текстовом поле:

class NamVcc: UIViewController, UITextFieldDelegate
{
    @IBOutlet var NamTxtBoxVid: UITextField!

    override func viewDidLoad()
    {
        super.viewDidLoad()

    // For hitting return key
        NamTxtBoxVid.delegate = self

    // For tapping outside text box
        self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(DismisKeyPadFnc)))
    }

/* For hitting return key */
    func textFieldShouldReturn(NamTxtBoxPsgVid: UITextField) -> Bool
    {
        NamTxtBoxPsgVid.resignFirstResponder()
        return true
    }

/* For tapping outside text box */
    func DismisKeyPadFnc()
    {
        view.endEditing(true)
    }
}


| * | Выполнение следующей кнопки Нажмите:
1) Вам нужно будет установить теги в инкрементной последовательности текстовых полей в xib/Storyboard или в коде.
2) Установите делегат для каждого из текстовых полей.
3) Затем вставьте следующий код в свой контроллер просмотра, чтобы получить желаемый эффект:

func textFieldShouldReturn(TxtBoxPsgVar: UITextField) -> Bool
{
    let NxtTxtBoxTagVal : Int = TxtBoxPsgVar.tag + 1

    let NxtTxtBoxVal: UIResponder? = TxtBoxPsgVar.superview?.superview?.viewWithTag(NxtTxtBoxTagVal)

    if let TxtBoxVal = NxtTxtBoxVal
    {
        // Found next responder, so set it.
        TxtBoxVal.becomeFirstResponder()
    }
    else
    {
        // Not found, so remove keyboard.
        TxtBoxPsgVar.resignFirstResponder()
    }
    return true
}

Ответ 11

Я думаю,

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

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

class TapHideTextField: UITextField {
override func awakeFromNib() {
    super.awakeFromNib()
    tapGr = UITapGestureRecognizer(target: self, action:"tap")
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "didBeginEditing", name:UITextFieldTextDidBeginEditingNotification, object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "didEndEditing", name:UITextFieldTextDidEndEditingNotification, object: nil)

}

deinit{
    NSNotificationCenter.defaultCenter().removeObserver(self)
}

var tapGr:UITapGestureRecognizer!
func tap(){
    self.endEditing(true)
}

func didBeginEditing(){
    self.superview!.addGestureRecognizer(tapGr)
}


func didEndEditing(){
    self.superview!.removeGestureRecognizer(tapGr)
}

}

вы должны заботиться о свойстве superview и cancelTouchesInView.

или в GitHub: https://github.com/lilidan/TapHideText/blob/master/TapHideTextField.swift

Ответ 12

-(void) textFieldDidBeginEditing: (UITextField *) textField{
     [self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(DismissKeyboard:)]];
}

-(void) DismissKeyboard:(UITapGestureRecognizer *) sender{
    [self.view endEditing:YES];
    [self.view removeGestureRecognizer:sender];
}