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;
}
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;
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]
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 .
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,
-
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.
-
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]; }
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];
}
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!
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?
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)
}
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