383 Stimmen

Einfacher Weg, die Tastatur zu verwerfen?

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?

2voto

user1270998 Punkte 51

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

1voto

Craig Miller Punkte 538

Möglicherweise müssen Sie auch UIViewController disablesAutomaticKeyboardDismissal überschreiben, damit dies in einigen Fällen funktioniert. Dies kann auf der UINavigationController getan werden müssen, wenn Sie eine haben.

1voto

mmmanishs Punkte 591

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.

1voto

JJ Rohrer Punkte 2672

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];

}

1voto

Eike Punkte 2161

Und im Handumdrehen können wir

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X