Ich habe eine ganze Reihe von Steuerelementen, die über viele Tabellenzellen in meiner Tabelle verstreut sind, und ich frage mich, ob es einen einfacheren Weg gibt, die Tastatur zu deaktivieren, ohne alle meine Steuerelemente in einer Schleife durchlaufen zu müssen und sie alle als erste Antwort zurücktreten zu lassen. Ich schätze, die Frage ist: Wie würde ich den aktuellen ersten Responder auf die Tastatur bekommen?
Antworten
Zu viele Anzeigen?Fügen Sie in der Header-Datei Ihres View-Controllers <UITextFieldDelegate>
in die Definition der Schnittstelle Ihres Controllers einfügen, damit sie mit dem UITextField-Delegate-Protokoll konform ist...
@interface someViewController : UIViewController <UITextFieldDelegate>
... Fügen Sie in der Implementierungsdatei des Controllers (.m) die folgende Methode hinzu, oder den darin enthaltenen Code, wenn Sie bereits eine viewDidLoad-Methode haben ...
- (void)viewDidLoad
{
// Do any additional setup after loading the view, typically from a nib.
self.yourTextBox.delegate = self;
}
... Verknüpfen Sie dann IhreTextBox mit Ihrem eigentlichen Textfeld
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField
{
if (theTextField == yourTextBox) {
[theTextField resignFirstResponder];
}
return YES;
}
Unterklassen für Textfelder... und auch für Textansichten
In die Unterklasse setzen Sie diesen Code..
-(void)conformsToKeyboardDismissNotification{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissKeyBoard) name:KEYBOARD_DISMISS object:nil];
}
-(void)deConformsToKeyboardDismissNotification{
[[NSNotificationCenter defaultCenter] removeObserver:self name:KEYBOARD_DISMISS object:nil];
}
- (void)dealloc{
[[NSNotificationCenter defaultCenter] removeObserver:self];
[self resignFirstResponder];
}
In den Textfeld-Delegierten (ähnlich wie bei den Textview-Delegierten)
-(void)textFieldDidBeginEditing:(JCPTextField *)textField{
[textField conformsToKeyboardDismissNotification];
}
- (void)textFieldDidEndEditing:(JCPTextField *)textField{
[textField deConformsToKeyboardDismissNotification];
}
Alles bereit. Jetzt müssen Sie nur noch die Benachrichtigung von einer beliebigen Stelle in Ihrem Code aus versenden. Es wird jede Tastatur zurücktreten.
Jeremy's Antwort hat bei mir nicht ganz funktioniert, ich glaube, weil ich einen Navigationsstapel in einer Registerkartenansicht mit einem modalen Dialogfeld darüber hatte. Ich verwende im Moment das Folgende und es funktioniert bei mir, aber das kann sich ändern.
// dismiss keyboard (mostly macro)
[[UIApplication sharedApplication].delegate dismissKeyboard]; // call this in your to app dismiss the keybaord
// --- dismiss keyboard (in indexAppDelegate.h) (mostly macro)
- (void)dismissKeyboard;
// --- dismiss keyboard (in indexAppDelegate.m) (mostly macro)
// do this from anywhere to dismiss the keybard
- (void)dismissKeyboard { // from: http://stackoverflow.com/questions/741185/easy-way-to-dismiss-keyboard
UITextField *tempTextField = [[UITextField alloc] initWithFrame:CGRectZero];
UIViewController *myRootViewController = <#viewController#>; // for simple apps (INPUT: viewController is whatever your root controller is called. Probably is a way to determine this progragrammatically)
UIViewController *uivc;
if (myRootViewController.navigationController != nil) { // for when there is a nav stack
uivc = myRootViewController.navigationController;
} else {
uivc = myRootViewController;
}
if (uivc.modalViewController != nil) { // for when there is something modal
uivc = uivc.modalViewController;
}
[uivc.view addSubview:tempTextField];
[tempTextField becomeFirstResponder];
[tempTextField resignFirstResponder];
[tempTextField removeFromSuperview];
[tempTextField release];
}