2012-04-07 15 views
2

Anstatt die Tastatur anzuzeigen, möchte ich eine Popover-Ansicht anzeigen, wenn ein TextField ausgewählt ist (mein Code ist am unteren Rand). Wenn die Tastatur nicht angezeigt wird, funktioniert alles super. Wenn jedoch die Tastatur angezeigt wird und dann das Textfeld ausgewählt ist, wird die Tastatur nicht verworfen, irgendwo müssen die ersten Antwortsender verloren gehen, aber ich weiß nicht wo. Hat jemand eine Lösung dafür?Tastatur reagiert nicht auf resignFirstResponder

Mein Textfeld:

self.startDateTextField = [[UITextField alloc] initWithFrame:CGRectMake(79, 148, 138, 27)]; 
[self.startDateTextField setBorderStyle:UITextBorderStyleRoundedRect]; 
[self.startDateTextField setDelegate:delegate]; 
[self.startDateTextField addTarget:delegate action:@selector(editStartDate:) forControlEvents:UIControlEventEditingDidBegin]; 
[popoverWrapper addSubview:self.startDateTextField]; 

und in editStartDate: ich habe:

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

[textField resignFirstResponder]; 

DatePickerVC *datePickerVC = [[DatePickerVC alloc] init]; 
datePickerVC.delegate = self; 

self.popoverController = [[UIPopoverController alloc] initWithContentViewController:datePickerVC]; 
[self.popoverController setDelegate:self]; 

[self.popoverController presentPopoverFromRect:CGRectMake(0, 0, 5, 5) inView:textField permittedArrowDirections:UIPopoverArrowDirectionRight animated:YES]; 
} 

Antwort

8

Dies ist sehr einfach zu tun, verwenden Sie Ihre UITextFieldDelegate-Methoden speziell UITextFieldShouldBeginEditing und geben Sie NO zurück und führen Sie den Code, um stattdessen das Popover anzuzeigen. Auf diese Weise wird die Tastatur nie gezeigt.

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { 
    [self.view endEditing:YES]; // added this in for case when keyboard was already on screen 
    [self editStartDate:textField]; 
    return NO; 
} 

für sie zu arbeiten sicherzustellen, dass Sie die Delegierten des Textfield selbst (die View-Controller) und in Ihrer editStartDate Methode setzen Sie den ResignFirstResponder Aufruf entfernen.

+1

Das hat perfekt funktioniert. Danke. Ich kann das Kopfgeld erst morgen vergeben, aber dann ist alles dein –

+0

Mein Tag gerettet :) – Xeieshan

0

wie diese versuchen in Ihrem editStartDate: Methode

[self.startDateTextField resignFirstResponder]; 

EDIT: Aber anstatt das zu tun Rücktritt die Tastatur whe Wenn Sie in das Textfeld klicken, können Sie mit setInputView für Textfield den popViewController aufrufen.

DatePickerVC *datePickerVC = [[DatePickerVC alloc] init]; 
datePickerVC.delegate = self; 

self.popoverController = [[UIPopoverController alloc] initWithContentViewController:datePickerVC]; 
[self.popoverController setDelegate:self]; 

[self.popoverController presentPopoverFromRect:CGRectMake(0, 0, 5, 5) inView:textField permittedArrowDirections:UIPopoverArrowDirectionRight animated:YES]; 

self.startDateTextField = [[UITextField alloc] initWithFrame:CGRectMake(79, 148, 138, 27)]; 
[self.startDateTextField setBorderStyle:UITextBorderStyleRoundedRect]; 
[self.startDateTextField setDelegate:delegate]; 
self.startDateTextField.inputView = self.popoverController; 
+0

Vielen Dank für Ihre Antwort, aber die popover Anzeige ist nicht, wo ich Probleme, bin. Ich kann die Tastatur nicht verschwinden lassen. Ich kann etwas missverstehen, aber ich bin immer noch nicht in der Lage, die Tastatur zu entkräften –

0

Sie versuchen also, die Tastatur sofort nach der Auswahl des Textfelds auszublenden und etwas anderes anzuzeigen?

ist es zwei Dinge, die ich denken kann:

  1. Geben Sie dem Textfeld einige Zeit zusammen zu bekommen, bevor der erste Responder ausscheid: [textField performSelector:@selector(resignFirstResponder) withObject:nil afterDelay:0.5];

  2. Stellen Sie die inputView Eigenschaft des Textfeldes zu Null oder UIView mit einer klaren Hintergrundfarbe.

-1

Wenn inputView auf das Textfeld, das Sie nicht bekommen, was Sie wollen, können Sie auch einfach eine unsichtbare Schaltfläche auf dem UITextField setzen und zeigen nur die popover von der Klage der Taste. Für den Benutzer wird es so aussehen, als ob das Textfeld das Popover ausgelöst hätte. Wenn die Tastatur zu diesem Zeitpunkt noch vorhanden ist, rufen Sie resignFirstResponder bei allen möglichen Ersthelfern (Textfelder usw.) an.

1

Sie scheinen den ersten Responder des Textfelds zu verlassen; Dies ist jedoch nicht unbedingt der erste Responder, was erklären könnte, warum das Aufrufen keinen Effekt hat.

Stattdessen sollten Sie die endEditing Kategorie verwenden, um durch alle Kinder Ihrer Ansicht nach Rekursion die Ersthelfer von welcher zum Rücktritt sehen es angebracht ist:

[self.view endEditing:YES]; 

In jedem Fall, wie Sie nie zeigen wollen Mit der Tastatur können Sie einfach UITextFieldDelegate implementieren, um das Standardverhalten zu überschreiben.

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
{ 
    // Your popover code. 

    return NO; 
} 

UITextFieldDelegate Protocol Reference.