Jak programowo odrzucić klawiaturę iOS po naciśnięciu klawisza Return

105

Utworzyłem UITextFieldprogramowo, tworząc UITextFieldwłaściwość viewController. Muszę odrzucić klawiaturę z powrotem i dotknięciem ekranu. Udało mi się dotknąć ekranu, aby zamknąć, ale naciśnięcie klawisza powrotu nie działa.

Widziałem, jak to zrobić za pomocą scenorysów oraz przez bezpośrednie przydzielanie i inicjowanie UITextFieldobiektu bez tworzenia go jako właściwości. Można to zrobić?

.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITextFieldDelegate>

@property (strong, atomic) UITextField *username;

@end

.m

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // Do any additional setup after loading the view, typically from a nib.
    
    self.view.backgroundColor = [UIColor blueColor];
    self.username = [[UITextField alloc] initWithFrame:CGRectMake(100, 25, 80, 20)];
    self.username.placeholder = @"Enter your username";
    self.username.backgroundColor = [UIColor whiteColor];
    self.username.borderStyle = UITextBorderStyleRoundedRect;
    if (self.username.placeholder != nil) {
        self.username.clearsOnBeginEditing = NO;
    }
    _username.delegate = self; 
    
    [self.view addSubview:self.username];
    [_username resignFirstResponder];
    
}

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

@end
noobsmcgoobs
źródło

Odpowiedzi:

265

Prostym sposobem jest podłączenie delegata UITextFielddo self ( self.mytestField.delegate = self) i odrzucenie klawiatury w metodzie textFieldShouldReturnprzy użyciu[textField resignFirstResponder];

Innym sposobem na zamknięcie klawiatury jest:

[self.view endEditing:YES];

Umieść miejsce, w [self.view endEditing:YES];którym chcesz odrzucić klawiaturę (zdarzenie przycisku, zdarzenie Touch, itp.).

Nitin Gohel
źródło
jednak kiedy podłączam delegata, pojawiają się ostrzeżenia i / lub błędy. Widziałem już twoją drogę, ale z jakiegoś powodu nie mogę go uruchomić. Czy te metody będą widoczne w viewDidLoad?
noobsmcgoobs
1
Jeśli podczas próby ustawienia delegata textField na siebie wystąpiły błędy, prawdopodobnie nie dodano UITextFieldDelegate do definicji klasy. W szczególności ... class ViewController: UIViewController, UITextFieldDelegate {...
TimWhiting
29

Dodaj metodę delegata, UITextFieldtaką jak ta:

@interface MyController : UIViewController <UITextFieldDelegate>

I ustaw, textField.delegate = self;a następnie dodaj dwie metody delegowaniaUITextField

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{   
    return YES;
}

// It is important for you to hide the keyboard
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}
iPatel
źródło
Dodajmy, że powyższe działa tylko wtedy, gdy twój kontroler implementuje UITextFieldDelegate w następujący sposób: @interface MyController : UIViewController <UITextFieldDelegate>
DerWOK
@iPatel Umieściłem te 2 metody, a także dodałem self.username.delegate = self i [self.username resignFirstResponder] w viewDidLoad. Działa to w obu scenariuszach, których potrzebowałem. Czy to normalne, czy używam za dużo kodu?
noobsmcgoobs
26

// Ukryj tablicę klawiszy, dotykając tła w widoku

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [[self view] endEditing:YES];
}
Vijay Dokrimare
źródło
24

po prostu użyj tego szybko, aby zamknąć klawiaturę:

UIApplication.sharedApplication().sendAction("resignFirstResponder", to:nil, from:nil, forEvent:nil)

Szybki 3

UIApplication.shared.sendAction(#selector(UIResponder.resign‌​FirstResponder), to: nil, from: nil, for: nil)
Chathuranga Silva
źródło
SWIFT 3UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
miff
17

SWIFT 4:

self.view.endEditing(true)

lub

Ustaw delegata pola tekstowego na bieżący kontroler widoku, a następnie:

func textFieldShouldReturn(_ textField: UITextField) -> Bool {

    textField.resignFirstResponder()

    return true

}

Cel C:

[self.view endEditing:YES];

lub

Ustaw delegata pola tekstowego na bieżący kontroler widoku, a następnie:

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];

    return YES;
}
Sam
źródło
9

W delegacie aplikacji możesz pisać

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

w ten sposób nie możesz pisać zbyt dużo kodu.

DKong
źródło
7

Spróbuj dowiedzieć się, czym jest osoba udzielająca pierwszej odpowiedzi w hierarchii widoków systemu iOS. Kiedy twoje pole tekstowe staje się aktywne (lub pierwsza pomoc) po dotknięciu w nim (lub przekazaniu mu komunikatu becomeFirstResponderprogramowo), wyświetla klawiaturę. Aby więc usunąć swoje pole tekstowe z bycia pierwszym respondentem, powinieneś przekazać tam wiadomość resignFirstResponder.

[textField resignFirstResponder];

Aby ukryć klawiaturę pod przyciskiem powrotu, należy zaimplementować metodę delegata textFieldShouldReturn:i przekazać resignFirstResponderkomunikat.

- (BOOL)textFieldShouldReturn:(UITextField *)textField{
    [textField resignFirstResponder];
    return YES;
}
Zen
źródło
7

Oto, czego używam w moim kodzie. To działa jak urok!

W yourviewcontroller.h dodaj:

@property (nonatomic) UITapGestureRecognizer *tapRecognizer;

Teraz w pliku .m dodaj to do swojej funkcji ViewDidLoad:

- (void)viewDidLoad {
    [super viewDidLoad];

    //Keyboard stuff
    tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
    tapRecognizer.cancelsTouchesInView = NO;
    [self.view addGestureRecognizer:tapRecognizer];
}

Dodaj również tę funkcję w pliku .m:

- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
    [self.view endEditing:YES];
}
Zabierz
źródło
1
pamiętaj tylko o akcji: @selector powinien wywołać tę samą nazwę metody, w której kończysz Edycja: TAK, w tym przypadku "handleSingleTap:"
Marcos Reboucas
4

Aby zamknąć klawiaturę po wyskakiwaniu klawiatury, istnieją 2 przypadki ,

  1. gdy UITextField znajduje się wewnątrz UIScrollView

  2. gdy UITextField znajduje się poza UIScrollView

2. gdy UITextField znajduje się poza UIScrollView, zastąp metodę w podklasie UIViewController

musisz również dodać delegata dla wszystkich UITextView

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.view endEditing:YES];
}
  1. W widoku przewijania dotknięcie na zewnątrz nie uruchomi żadnego zdarzenia , więc w takim przypadku użyj narzędzia do rozpoznawania gestów Tap , przeciągnij i upuść UITapGesture dla widoku przewijania i utwórz dla niego IBAction .

aby utworzyć IBAction, naciśnij ctrl + kliknij UITapGesture i przeciągnij go do pliku .h programu viewcontroller.

Tutaj nazwałem tappedEvent jako moją nazwę akcji

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

powyższe informacje pochodzą z poniższego linku, proszę zapoznać się z dodatkowymi informacjami lub skontaktować się ze mną, jeśli nie rozumiesz powyższych danych.

http://samwize.com/2014/03/27/dismiss-keyboard-when-tap-outside-a-uitextfield-slash-uitextview/


źródło
Dzięki. Twoja odpowiedź pomogła mi ..!
Archit Kapoor,
4

Dla grupy UITextViews wewnątrz a ViewController:

Swift 3.0

for view in view.subviews {
    if view is UITextField {
        view.resignFirstResponder()
    }
}

Cel C

// hide keyboard before dismiss
for (UIView *view in [self.view subviews]) {
    if ([view isKindOfClass:[UITextField class]]) {
        // no need to cast
        [view resignFirstResponder];
    }
}
Matias Elorriaga
źródło
3

Ponieważ tagi mówią tylko o iOS i opublikuję odpowiedź dla Swift 1.2 i iOS 8.4, dodaj je do klasy swift kontrolera widoku:

// MARK: - Close keyboard when touching somewhere else
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {

    self.view.endEditing(true)

}

// MARK: - Close keyboard when return pressed
func textFieldShouldReturn(textField: UITextField!) -> Bool {

    textField.resignFirstResponder()

    return true
}
// MARK: -

Nie zapomnij również dodać UITextFieldDelegate w deklaracji klasy i ustawić delegata pól tekstowych na siebie (widok).

Juan Boero
źródło
3

W Swift 3

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

LUB

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        if textField == yourtextfieldName
        {
            self.resignFirstResponder()
            self.view.endEditing(true)
        }
    }
Amul4608
źródło
2

Oto, co zrobiłem, aby odrzucić po dotknięciu tła lub powrocie. Musiałem dodać delegate = self w viewDidLoad, a następnie także metody delegata później w plikach .m.

.h
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITextFieldDelegate>


@property (strong, atomic) UITextField *username;

@end

.m
- (void)viewDidLoad
{
    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    self.view.backgroundColor = [UIColor blueColor];
    self.username = [[UITextField alloc] initWithFrame:CGRectMake(100, 25, 80, 20)];
    self.username.placeholder = @"Enter your username";
    self.username.backgroundColor = [UIColor whiteColor];
    self.username.borderStyle = UITextBorderStyleRoundedRect;
    if (self.username.placeholder != nil) {
        self.username.clearsOnBeginEditing = NO;
    }
    self.username.delegate = self;
    [self.username resignFirstResponder];
    [self.view addSubview:self.username];


}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    return YES;
}



- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

@end
noobsmcgoobs
źródło
2

Po prostu użyj tego w Objective-C, aby odrzucić klawiaturę:

[[UIApplication sharedApplication].keyWindow endEditing:YES];
Linc
źródło
1

Najpierw musisz dodać delegata pola tekstowego w pliku .h. jeśli nie, zadeklaruj, że (BOOL)textFieldShouldReturn:(UITextField *)textFieldta metoda nie jest wywoływana. więc najpierw dodaj delegata i zapisz kod ukrywania klawiatury w tej metodzie.

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

Spróbuj tego..

Jitendra
źródło
0

Dodaj delegata: UITextFieldDelegate

@interface ViewController : UIViewController <UITextFieldDelegate>

a następnie dodaj tę metodę delegata

// To powinno działać idealnie

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}
Ravi_Parmar
źródło
0
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.view.subviews enumerateObjectsUsingBlock:^(UIView* obj, NSUInteger idx, BOOL *stop) {
    if ([obj isKindOfClass:[UITextField class]]) {
        [obj resignFirstResponder];
    }
}];
}

gdy używasz więcej niż jednego pola tekstowego na ekranie Dzięki tej metodzie nie musisz za każdym razem wspominać o polu tekstowym, np

[textField1 resignFirstResponder];
[textField2 resignFirstResponder];
Harshad
źródło
0

Swift 2:

to jest to, co robi się, aby zrobić wszystko!

zamknij klawiaturę Doneprzyciskiem lub Touch outSide, Nextaby przejść do następnego wejścia.

Najpierw zmień plik TextFiled Return Keyna Nextw StoryBoard.

override func viewDidLoad() {
  txtBillIdentifier.delegate = self
  txtBillIdentifier.tag = 1
  txtPayIdentifier.delegate  = self
  txtPayIdentifier.tag  = 2

  let tap = UITapGestureRecognizer(target: self, action: "onTouchGesture")
  self.view.addGestureRecognizer(tap)

}

func textFieldShouldReturn(textField: UITextField) -> Bool {
   if(textField.returnKeyType == UIReturnKeyType.Default) {
       if let next = textField.superview?.viewWithTag(textField.tag+1) as? UITextField {
           next.becomeFirstResponder()
           return false
       }
   }
   textField.resignFirstResponder()
   return false
}

func onTouchGesture(){
    self.view.endEditing(true)
}
Mojtabye
źródło
0

Jeśli nie znasz bieżącego kontrolera widoku lub widoku tekstowego, możesz użyć łańcucha odpowiedzi:

UIApplication.shared.sendAction(#selector(UIView.endEditing(_:)), to:nil, from:nil, for:nil)
zimny ogień
źródło
0

dla szybkiego 3-4 naprawiłem jak

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
    return false
}

po prostu skopiuj wklej w dowolnym miejscu na zajęciach. To rozwiązanie po prostu działa, jeśli chcesz, aby wszystkie UItextfield działały tak samo lub jeśli masz tylko jedno!

hall.keskin
źródło