Zamknij klawiaturę-wiele pól UITextFields w iOS 7

Poniżej znajdziesz moje .h & pliki m dla mojego głównego kontrolera widoku.

Mam 3 pytania.

1.) Ponieważ mam wiele uitextfields, Czy muszę ustawić każdy z własnym oświadczeniem recipfirstresponder ? i 2.) gdzie miałbym to zrobić, w jakiej metodzie ? 3.) Czy moja składnia jest odpowiednia do rezygnacji z pierwszej odpowiedzi ?

Również byłoby naprawdę miło, gdybym mógł zamknąć klawiaturę, gdy użytkownik kliknie poza pole, a nie po naciśnięciu klawisza powrotu!

I wiem, że pytano o to i odpowiadano wcześniej, ale szczerze mówiąc, nadal jestem trochę zdezorientowany, co idzie gdzie.

Używam storyboardów, z XCode 5 i iOS 7.

=============================

.plik h

@interface ViewController : UIViewController <UITextFieldDelegate,UITableViewDelegate,UITableViewDataSource>

@property (weak, nonatomic) IBOutlet UITextField *danceDate;
@property (weak, nonatomic) IBOutlet UITextField *dancePlace;
@property (weak, nonatomic) IBOutlet UITextField *danceTerminal;
@property (weak, nonatomic) IBOutlet UITextField *danceGate;

.plik m

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self retrieveFromParse];

    self.tableView.dataSource = self;
    self.tableView.delegate = self;
    self.navigationItem.rightBarButtonItem = self.editButtonItem;

    // SET DELEGATE HERE
    //
    // if I uncomment 1 of these lines, i'll get an error.
    //
    // _dancePlace.delegate = self; 
    // dancePlace.delegate = self; 
    // dancePlace = self; 

}

- (void)textFieldDidBeginEditing:(UITextField *)textField
{

}

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

    return YES;
}


-(BOOL) textFieldShouldReturn: (UITextField *) textField
{
    return YES;
}
Author: Fogmeister, 2013-10-29

8 answers

Rezygnacja z pola tekstowego: / Align = "left" / delegat powinien być ustawiony jako obiekt Viewcontrollera. A następnie zaimplementuj poniższą metodę delegowania.

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

Aby wyłączyć klawiaturę w widoku: Dodaj gest stukania do kontrolera ViewController.zobacz w następujący sposób:

//declare a property to store your current responder
@property (nonatomic, assign) id currentResponder;


//in viewDidLoad:

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(resignOnTap:)];
    [singleTap setNumberOfTapsRequired:1];
    [singleTap setNumberOfTouchesRequired:1];
    [self.view addGestureRecognizer:singleTap];
    [singleTap release];

//Implement the below delegate method:

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    self.currentResponder = textField;
}

//Implement resignOnTap:

- (void)resignOnTap:(id)iSender {
    [self.currentResponder resignFirstResponder];
}
// was missing ; after the call --> [self.currentResponder resignFirstResponder]
    // also in textFieldDidEndEditing set self.currentResponder = nil;
 33
Author: dRAGONAIR,
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-11-13 21:02:38

Spróbuj:

[[self view] endEditing:YES]
 40
Author: Kamaros,
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
2013-10-28 23:49:16
  -(BOOL) textFieldShouldReturn: (UITextField *) textField{

        [textField resignFirstResponder];
        return YES;
  }

Również połączyć swoje UITextField Delegat .

 4
Author: Mirko Catalano,
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
2013-11-03 20:26:05

Ta odpowiedź działa na iOS 7 i arc,

  1. Wyłącz klawiaturę, gdy użytkownik dotknie return: w ViewController dodaj następującą akcję

    -(IBAction)textFieldReturn:(id)sender
    {
        [sender resignFirstResponder];
    }
    

Następny, w głównym.storyboard wybierz pole tekstowe i z Inspektora połączeń control + przeciągnij Zdarzenie" Did End On Exit " do kontrolera widoku.

  1. Wyłącz klawiaturę, gdy użytkownik dotknie tła: wdrożyć następującą metodę w ViewController

     - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    
            UITouch *touch = [[event allTouches] anyObject];
            if ([YOUR_TEXT_FIELD isFirstResponder] && [touch view] != YOUR_TEXT_FIELD) {
                [YOUR_TEXT_FIELD resignFirstResponder];
            }
            [super touchesBegan:touches withEvent:event];
        }
    
 4
Author: Daniel Shalev,
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-03-15 00:46:40

Oto, czego używam w moim kodzie. Działa świetnie i jest bardziej wydajny niż inne odpowiedzi.

W yourviewcontroller.h add:

@property (nonatomic) UITapGestureRecognizer *tapRecognizer;

Teraz w .plik m, dodaj to do funkcji ViewDidLoad:

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

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

- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
    [self.view endEditing:YES];
}
 4
Author: Takide,
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-07 19:58:30

Gdy dana UITextField wywołuje metodę delegata - (BOOL)textFieldShouldReturn:(UITextField*)textField, przekazuje się jako argument.

Więc konkretny textField dostępny jako argument dla tej metody jest konkretny, na którym ci zależy. W ramach tej metody delegowania możesz po prostu odnieść się do niej jako "textField".

Oznacza to, że powinieneś używać tego, co Mirko Catalano zalecał wywołanie resignFirstResponder na textField, a nie na poszczególnych właściwościach, jak to robiłeś.

Sugestia Mirko, aby zweryfikować, że delegat jest rzeczywiście przypisany jest krytyczny, jak również. Będziesz chciał się upewnić, że wszystkie Twoje pola UITextFields w stalówce lub storyboardzie mają swoją właściwość delegata wskazującą na właściciela pliku. W przeciwnym razie wiadomość delegata zniknie i zostanie natychmiast zignorowana!

 1
Author: ryan cumley,
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
2013-10-29 00:50:11

Spróbuj użyć self.dancePlace.delegate = self; zamiast dancePlace.delegate = self;, aby ustawić UITextFieldDelegate. Czy to działa?

 1
Author: tomi,
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
2013-10-29 08:35:43

W swift 3:

 //Dismiss keyboard , When touch outside
 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
    {
        self.view.endEditing(true)
    }
 0
Author: yehyatt,
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-06-29 08:19:27