Jak wyłączyć klawiaturę klawiatury numerycznej, dotykając w dowolnym miejscu

Chciałbym znać najprostszy kod, aby wyłączyć klawiaturę number pad podczas stukania w dowolnym miejscu poza klawiaturą number pad. Jest to prosta aplikacja do wprowadzania liczby w polu tekstowym, a następnie użytkownik może zamknąć klawiaturę po tym, jak Użytkownik skończy wpisywać liczby w polu tekstowym. Dzięki! :)

Author: Filip Radelic, 2011-08-09

15 answers

Deklarowanie pola tekstowego jako zmiennej instancji lub właściwości, jeśli jeszcze nie jest i implementowanie prostej metody takiej jak Ta:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
    [textField resignFirstResponder];
}
Będzie dobrze.
 84
Author: Filip Radelic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-09 06:21:56

Wypróbuj tę metodę,

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

Teraz dotknij gdziekolwiek i zobacz klawiatura zostanie odrzucona. :-)

 21
Author: Gajendra K Chauhan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-26 03:02:35

Do Szybkiego Użycia Poniżej Kodu

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

Sprawdź najnowszą aktualizację pod linkiem

 7
Author: abdul sathar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:30:55

Dotykanie tła, aby zamknąć klawiaturę

Przejdź do Xcode, jeśli jeszcze cię tam nie ma. Musimy dodać jeszcze jedną akcję do naszej klasy kontrolerów. Dodaj następujący wiersz do kontrolera Control_FunViewController.plik 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  

Zapisz plik nagłówkowy; przełącz się do pliku implementacji i dodaj ten kod, który po prostu mówi obu Polom tekstowym, aby dały status pierwszej odpowiedzi, jeśli go posiadają. Jest to całkowicie bezpieczne, aby zadzwonić do resignFirstResponder na kontroli, która nie jest pierwszym respondera, więc możemy bezpiecznie wywołać go w obu polach tekstowych bez konieczności sprawdzania, czy jedno z nich jest pierwszym respondentem.

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

Końcówka Zapisz ten plik i wróć do programu Interface Builder. Teraz musimy zmienić podstawową klasę naszego widoku stalówki. Jeśli spojrzysz na główne okno stalówki, zobaczysz, że w tym widoku są trzy ikony. Trzeci, zwany View, jest głównym widokiem naszej stalówki, który przechowuje wszystkie pozostałe kontrolki i widoki jako podwidywki. Jednym kliknięciem ikony o nazwie Widok, która reprezentuje widok kontenera naszej stalówki. Naciśnij ␣4, aby przywołać Inspektora tożsamości. W tym miejscu możemy zmienić podstawową klasę dowolnej instancji obiektu w Interface Builder.

Będziesz często przełączał się między plikami nagłówkowymi i implementacyjnymi podczas kodowania. Na szczęście Xcode ma kombinację klawiszy, która szybko przełączy cię między tymi plikami. Domyślną kombinacją klawiszy jest ␣ ␣ ␣ (opcja-polecenie-strzałka w górę), chociaż można go zmienić na cokolwiek chcesz za pomocą preferencji Xcode.76

Pole oznaczone jako Class aktualnie mówi UIView. Zmień go na read UIControl. Wszystkie kontrolki, które są zdolne do działania Tryg-geringa są podklasami UIControl, więc zmieniając podstawową klasę, właśnie daliśmy temu widokowi możliwość wyzwalania metod działania. Możesz to sprawdzić, naciskając ␣2, aby wywołać Inspektora połączeń.

Przeciągnij ze zdarzenia Touch Down do ikony właściciela pliku i wybierz akcję backgroundTap:. Teraz dotknij gdziekolwiek w widoku bez aktywnego sterowania uruchomi naszą nową metodę akcji, która spowoduje cofnięcie klawiatury.

Uwaga Uratuj stalówkę i spróbujmy. Skompiluj i uruchom ponownie aplikację. Tym razem klawiatura powinna zniknąć nie tylko po naciśnięciu przycisku Gotowe, ale także po kliknięciu w dowolnym miejscu, które nie jest aktywną kontrolą, czego oczekuje użytkownik.

 6
Author: rptwsthi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-07 04:11:03

Próbowałem wdrożyć niektóre z tych rozwiązań i stwierdziłem, że są z nimi pewne problemy. W szczególności Mój UIView zawiera UIScrollView, który zdaje się przechwytywać dotyki.

Kiedy to się nie udało, uznałem, że "stukanie w dowolnym miejscu" jest trochę nieokreślonym zachowaniem, wymagającym od użytkownika odgadnięcia, jak odrzucić klawiaturę, zamiast dawać im jasne wskazówki.

Ponadto, mam przycisk" zwrot "lub" gotowe " na każdej innej klawiaturze, którą pokazuję w aplikacji, więc byłem zdeterminowany, aby daj użytkownikowi łatwy, intuicyjny, jasno określony sposób zwalniania klawiatury za pomocą klawiatury numerycznej, która była zgodna z innymi używanymi mechanizmami zwalniania klawiatury.

Zdaję sobie sprawę, że nie jest to dokładnie to, o co prosi OP, ale uważam, że jest to lepsze rozwiązanie niż żądanie" tap anywhere " (i jest łatwe do wdrożenia!).

Poniższy kod jest wywoływany jako część -viewDidLoad w moim 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's the only item in the UIToolbar's 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;

Z tym, jest ładny, ładny, intuicyjny sterownik dodany do górna część klawiatury, która wyraźnie wskazuje, jak użytkownik powinien postępować po zakończeniu wprowadzania tekstu.

Nadal uważam, że Apple powinno zapewnić przycisk "Gotowe" dla tej klawiatury (jak link zamieszczony przez janaka Nirmala), ale jest to najbardziej eleganckie rozwiązanie nie-Apple dla mnie.

 3
Author: mbm29414,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-02 13:36:18

Musisz użyć UITapGestureRecognizer, aby to osiągnąć.

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

Następnie w swojej metodzie closernumberkeyboard,

-(Void)dismissNumberKeyboard : (id)sender {

   [yourTextField resignFirstResponder];

}
Szczęśliwego kodowania!
 2
Author: Valentina,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-11 13:42:26

Po prostu zrób prostą funkcję, taką jak ta..

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

Teraz przejdź do pliku ur nib i połącz tę funkcję z pole tekstowe za pomocą {[1] } i możesz iść. Teraz, gdy u kliknie poza ur textfield klawiatura ukryje się.

 1
Author: Hadi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-09 06:09:05

Możesz bardzo ładnie zaimplementować odpowiedź @mbm, umieszczając didSet na wylocie i dołączając tam swój inputAccessoryView:

Kod Swift:

  @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
  }}

W xcode 8 / iOS 10 kończy się tak:

Tutaj wpisz opis obrazka

 1
Author: SimplGy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-02 00:56:06

Zwykle, gdy użytkownik dotknie przycisku "Anuluj", używam tego do odrzucenia klawiatury -

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

Jeśli chcesz to zrobić, gdy użytkownik dotknie gdziekolwiek poza obszarem klawiatury, musisz zaimplementować touchesEnded i umieścić tam ten kod -

/* Delegate for when touch ends.  */
-(void)touchesEnded:(NSSet *)touches 
          withEvent:(UIEvent *)event
{
    [searchBar resignFirstResponder];
}
Sam tego nie próbowałem, ale wiem, że to powinno załatwić sprawę...
 0
Author: Srikar Appalaraju,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-09 03:45:39

Musiałem zaimplementować podobny UX dla mojego UITableView (wewnątrz którego pojawia się UITextField). Najpierw dodaj UITapGestureRecognizer do widoku tabeli. To zacznie łapać wszystkie krany, które występują od teraz.

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

Efektem ubocznym jest jednak to, że nie chcesz zamykać klawiatury, gdy użytkownik dotknie samego pola UITextField. Więc ta sprawa musi zostać wyróżniona.

Implementacja metody handleTap wygląda jak-

/*
 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's 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];
    }
}

HTH. Zaznacz to jako odpowiedź, jeśli chcesz to.

-Akshay

 0
Author: Akshay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-09 03:53:58

Jeśli wykonałeś niestandardową klawiaturę numeryczną lub inne wyskakujące okienko, innym rozwiązaniem byłoby użycie rozpoznawania gestów w init UIView w następujący sposób:

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;

I niech handleSingleTap zamknie okienko, jeśli jest widoczne i zamknie edycję:

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

    [self endEditing:YES];
}
 0
Author: arinmorf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-26 09:07:43

W xcode 5 Użyj rozpoznawania gestów Dotknij i zadeklaruj w .h Z action wybrał nazwę i w .m

- (IBAction)backgroundTap:(id)sender {
    [self.view endEditing: YES];
}
 0
Author: gerachev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-26 18:13:09

Wiele odpowiedzi tutaj, ale nadal musiał walczyć, aby dowiedzieć się za pomocą XCode 5. Przeczytaj to: https://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/GestureRecognizer_basics/GestureRecognizer_basics.html

Dodaj rozpoznawanie gestów stukania do widoku UIScrollView. Ustaw jego delegata jako viewcontroller.

Dodaj tę metodę:

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

Do kodu implementacji UIScrollView i powiązać go z gestem dotknięcia Rozpoznawanie po kliknięciu sterującym i przeciągnięciu do kodu implementacji.

Zadziałało dla mnie.
 0
Author: Bill Noto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-18 02:33:03

W przypadku Swifta najprostszym rozwiązaniem dla wszystkich pól tekstowych jest naciśnięcie klawisza w dowolnym miejscu poza polem tekstowym:

override func touchesBegan(touches: NSSet, withEvent event: UIEvent)
{
    self.view.endEditing(true)
}
 0
Author: XIII,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-02 06:34:03

Za swift 3/4 podoba mi się ta sprawa:

  1. kontroler widoku jest podklasą dla UITextFieldDelegate
  2. w funkcji viewDidLoad należy ustawić yourPhonePadField.delegate = self
  3. I nadpisać tę funkcję:

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
       self.view.endEditing(true) 
    }
    
 0
Author: Oleksii Radetskyi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-22 17:28:47