2010-07-27 11 views
6

Ich habe diese Website durchsucht, dass ich keine Lösung für das Problem finden konnte, die ich jetzt konfrontiert bin. Hoffe jemand kann helfen.ResignFirstResponder nicht die Tastatur (iPhone)

Ich habe eine UIAlertView erstellt, um den Benutzer aufzufordern, seinen Namen in eine iPhone App einzugeben.

UIAlertView *enterNameAlert = [[UIAlertView alloc] initWithTitle:@"Enter your name" 
                  message:@"\n\n\n" 
                  delegate:self 
                cancelButtonTitle:NSLocalizedString(@"Cancel", nil) 
                otherButtonTitles:NSLocalizedString(@"OK", nil),nil]; 

    UITextField *enterNameField = [[UITextField alloc] initWithFrame:CGRectMake(16, 83, 252, 25)]; 
    enterNameField.keyboardAppearance = UIKeyboardAppearanceAlert; 
    enterNameField.borderStyle = UITextBorderStyleRoundedRect; 
    enterNameField.autocorrectionType = UITextAutocorrectionTypeNo; 
    enterNameField.clearButtonMode = UITextFieldViewModeWhileEditing; 
    enterNameField.returnKeyType = UIReturnKeyDone; 
    enterNameField.delegate = self; 
    [enterNameField becomeFirstResponder]; 
    [enterNameAlert addSubview:enterNameField]; 

    [enterNameAlert show]; 
    [enterNameAlert release]; 
    [enterNameField release]; 

Ich habe Setup diese Viewcontroller mit UITextFieldDelegate in der Header-Datei zu entsprechen, und implementiert textFieldShouldReturn: versucht, die Tastatur zu schließen, wenn der Benutzer Hit Fertig.

- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
    if ([textField isFirstResponder]) { 
     [textField resignFirstResponder]; 
     NSLog(@"text field was first responder"); 
    } else { 
     [textField becomeFirstResponder]; 
     [textField resignFirstResponder]; 
     NSLog(@"text field was not first responder"); 
    } 
    NSLog(@"textfieldshouldreturn"); 
    return YES; 
} 

Im Debugger bestätigen I, dass diese Methode erfolgreich aufgerufen wird, wenn I auf die Schaltfläche Fertig tippen, wobei das Textfeld zu dieser Zeit der erste Responder sein. Die Tastatur geht jedoch nicht weg, aber der kleine ClearButton verschwindet. Es ist klar, dass das TextField nicht mehr der Ersthelfer ist, denn wenn ich erneut auf die Schaltfläche Fertig klicke, wird nichts aufgerufen. Ich möchte nur die Tastatur mit der Schaltfläche Fertig verlassen. Kann mir bitte jemand eine Lösung anbieten? Tausend Dank.

+0

Was passiert, wenn Sie das Textfeld als eine Eigenschaft in Ihrem View-Controller festlegen und sicherstellen, dass Sie es behalten, selbst nachdem die Warnung beendet wurde? Ich frage mich, ob es vielleicht freigegeben wird, bevor die Ereignisschleife dazu kommt, die resignFirstResponder-Nachricht oder etwas Seltsames zu senden. P.S. Haben wir früher zusammen gearbeitet? – clozach

Antwort

6

Zuerst müssen Sie Ihre enterNameAlert im Interface-Header definieren. Dann benutze den folgenden Code.

- (void)viewDidLoad {  
    [super viewDidLoad]; 
    enterNameAlert = [[UIAlertView alloc] initWithTitle:@"Enter your name" 
                  message:@"\n\n\n" 
                  delegate:self 
                cancelButtonTitle:NSLocalizedString(@"Cancel", nil) 
                otherButtonTitles:NSLocalizedString(@"OK", nil),nil]; 

    UITextField *enterNameField = [[UITextField alloc] initWithFrame:CGRectMake(16, 83, 252, 25)]; 
    enterNameField.keyboardAppearance = UIKeyboardAppearanceAlert; 
    enterNameField.borderStyle = UITextBorderStyleRoundedRect; 
    enterNameField.autocorrectionType = UITextAutocorrectionTypeNo; 
    enterNameField.clearButtonMode = UITextFieldViewModeWhileEditing; 
    enterNameField.returnKeyType = UIReturnKeyDone; 
    enterNameField.delegate = self;  
    [enterNameAlert addSubview:enterNameField]; 
    [enterNameField becomeFirstResponder]; 
    [enterNameAlert show];  
    [enterNameField release]; 
} 

- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
    if ([textField isFirstResponder]) { 
     [textField resignFirstResponder]; 
     [enterNameAlert dismissWithClickedButtonIndex:1 animated:YES]; 
     [enterNameAlert release]; 
     NSLog(@"text field was first responder"); 
    } else { 
     [textField becomeFirstResponder]; 
     [textField resignFirstResponder]; 
     NSLog(@"text field was not first responder"); 
    } 
    NSLog(@"textfieldshouldreturn"); 
    return YES; 
} 
+0

Das funktioniert !! Aber ich muss [enterNameAlert release] aus der TextFieldSoul Methode (BOOL) textFieldShouldReturn: (UITextField *) entfernen. Andernfalls wird die App einfach abstürzen und beenden, nachdem ich auf "Fertig" geklickt habe. Aber ich kenne mich mit dem Gedächtnis nicht aus. Wird es dadurch ein Speicherleck geben? – Anthony

+0

Wenn Sie enterNameAlert nicht innerhalb von textFieldShouldReturn freigeben möchten. Es ist in Ordnung. Aber Sie müssen es an anderer Stelle in der Implementierung freigeben. sagen wir mal: -dealloc { [enterNameAlert release]; [super dealloc]; } –

+0

Hmm, [funktioniert nicht für mich] (http://stackoverflow.com/q/6866932/434423). –

0

Was passiert, wenn Sie die Freigabe des Textfelds in die Delegate-Methode verschieben, nachdem Sie die resignFirstResponder-Methode aufgerufen haben?

+0

Danke für Ihre Hilfe. Aber das funktioniert nicht. – Anthony

0

Versuchen Sie, die Tastatur mit resignFirstResponder auf "DidEndOnExit" Ereignis Ihres TextField zu entlassen.

Versuchen Sie dann, die Tastatur durch Drücken der Taste Fertig auf der Tastatur zu schließen, wenn Sie die Daten in Ihr TextField eingegeben haben.

Hoffe, das hilft.

+0

Implementieren ResignFirstResponder auf - (IBAction) DidEndOnExit: (id) sender { // Hier Ihren Code eingeben } –

+0

Hat diese obige Lösung helfen? –

+0

Danke für Ihre Hilfe. Aber das funktioniert nicht. – Anthony

0

Ein anderes Objekt werden und dann sofort den ersten Responder aufgeben.

+0

Sorry, ich bin mir nicht sicher, wie ich das erreichen kann. – Anthony

0

tun einfach

[mytextField addTarget:self 
      action:@selector(methodToFire:) 
      forControlEvents:UIControlEventEditingDidEndOnExit]; 
0

wenn jemand in Storyboard mit diesem Fehler, ich in meine UITextFields Eigenschaften und Strg + Ziehen von seinem Delegierten zu seiner Wurzel-View-Controller alle in Storyboard gehen hatte und dass Alles behoben ..

Verwandte Themen