iOS becomeFirstResponder und alertView passen nicht zusammen

Ich hab‘ ein kleines Problem mit becomeFirstResponder

Datenerfassung am iPhone/iPad macht man mit der Klasse UITextField. Davon seien gleich zwei Instanzen field1 und field2 erzeugt und in einem View angeordnet.
Der Benutzer soll sich das gewünschte Eingabefeld nicht wie üblich per Tap selbst aussuchen, sondern das Programm präsentiert ihm das nächste Eingabefeld automatisch mit Hilfe der Methode becomeFirstResponder. Die ist dafür zuständig, dass die Tastatur hochgefahren und das Feld eingabebereit ist.

2 Eingabefelder
Der Benutzer gibt die Daten ein, bestätigt dann mit „Return“. Das Programm fährt die Tastatur mit Hilfe der Methode resignFirstResponder wieder ein.

Die Daten werden verarbeitet, die Verarbeitung erzeugt eine oder zwei Popup-Meldungen alert1 und alert2 (Klasse UIAlertView) und dann verzweigt der Dialogfluß zum nächsten Eingabefeld field2 oder bleibt beim aktuellen Feld field1 hängen zwecks Eingabe-Wiederholung.

Aus diesen Elementen lassen sich Dialogfolgen bauen:

  • field1 … field2
  • field1 … alert1 … field2
  • field1 … alert1 … field1
  • field1 … alert1 … alert2 … field2

Interessanterweise läßt sich aber nicht diese Folge bauen:

  • field1 … alert1 … alert2 … field1

Hier versagt becomeFirstResponder:
Nach dem zweiten Ansteuern von field1 wird die Tastatur nicht hochgefahren und eine Dateneingabe ist nicht mehr möglich.

Ein bisschen Code zum Ausprobieren:

- (void)viewDidLoad
{
  [super viewDidLoad];
  [field1 becomeFirstResponder];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
  [textField resignFirstResponder];
  return YES;
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
  [self doAlert:@"Message 1" withTag:1];
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
  switch (alertView.tag) {
    case 1:
      [self doAlert:@"Message 2" withTag:2];
      break;
      
    case 2:
      [field1 becomeFirstResponder];
      break;
      
    default:
      break;
  }
}

- (void)doAlert:(NSString *)msg withTag:(NSInteger)tag
{
  UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Test"
                                                  message:msg
                                                 delegate:self
                                        cancelButtonTitle:@"OK"
                                        otherButtonTitles:nil];
  alert.tag = tag;
  [alert show];
}

Auflösung:
Die Koordination von Alert-Responder und Field-Responder funktioniert nach dem zweiten Alert nicht mehr. Man kann das durch eine verzögerte Ausführung entflechten:

[field1 becomeFirstResponder]

umwandeln in

[field1 performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0]

Schon komisch…

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.