2010-11-02 7 views
3

J'essaie d'ajouter une nouvelle cellule à une tableview, et d'afficher une alerte avec un UITextField pour permettre à l'utilisateur d'entrer le titre qu'il souhaite donner à la nouvelle cellule. J'ai le code pour faire apparaître une alerte avec un UITextField quand le bouton "+" est pressé, et le code pour ajouter une nouvelle cellule, mais je ne sais pas comment obtenir le texte de l'UITextField pour l'insérer dans le titre de la cellule .Comment obtenir du texte à partir de UITextField dans un UIAlertView

C'est mon code pour faire apparaître l'alerte:

UIAlertView* alertPopUp = [[UIAlertView alloc] init]; 
[alertPopUp setDelegate:self]; 
[alertPopUp setTitle:@"Enter event title"]; 
[alertPopUp setMessage:@" "]; 
[alertPopUp addButtonWithTitle:@"Cancel"]; 
[alertPopUp addButtonWithTitle:@"OK"]; 

UITextField * eventNameField = [[UITextField alloc] initWithFrame:CGRectMake(20.0, 45.0, 245.0, 25.0)]; 
[eventNameField setBackgroundColor:[UIColor whiteColor]]; 
[alertPopUp addSubview:eventNameField]; 
[alertPopUp show]; 

et mon action alertView est:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 
NSString *buttonTitle=[alertView buttonTitleAtIndex:buttonIndex]; 
if([buttonTitle isEqualToString:@"Cancel"]) { 
    return; 
} 
else if([buttonTitle isEqualToString:@"Ok"]) { 

} 

} 

Que puis-je faire pour obtenir le texte de eventNameField quand "Ok" est pressé et l'ajouter à un mutablearray nommé eventList? Merci!

Répondre

8

Définissez la balise sur eventNameField à quelque chose de significatif

eventNameField.tag = 1001; 

ensuite à l'intérieur de la alertViewDelegate vous pouvez obtenir le TextField en utilisant - [UIView viewWithTag:]

UITextField* textField = (UITextField*)[alertView viewWithTag:1001]; 
1

eventNameField.text devrait vous donner la valeur

//declare the array 
NSMutableArray* eventList = [NSMutableArray array]; 

//set its value 
[eventList addObject:eventNameField.text]; 
0

DHamrick a probablement le meilleur solution, mais en a trouvé un de plus qui pourrait fonctionner.

Vous pouvez obtenir tous les sous-vues à l'intérieur alertView avec [alertView subviews] (retourne un NSCFArray), alors il vous suffit de trouver celui qui est de la classe UITextField, dans votre cas, vous pouvez l'obtenir avec:

[[[alertView subviews] objectAtIndex:4] text] 
+0

Cela fonctionnera dans la version iOS actuelle, mais pourrait être cassé dans une future version si elles changent le nombre de sous-vues dans un UIAlertView. C'est une bonne idée cependant. – DHamrick

+0

Vous pouvez vérifier la classe de l'objet retourné, si c'est de la classe UITextField qu'il devrait être votre UITextField (si Apple n'en ajoute pas un dans le futur SDK :) – Ladislav

0

Les anciennes réponses ne tirent pas parti des modifications de UIAlertView.

Dans iOS 5 et au-delà, il existe un moyen plus facile d'utiliser UITextField sur une vue d'alerte:

UIAlertView *alertPopUp = [[UIAlertView alloc] initWithTitle:@"Enter event title" message:@"" delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil]; 

    alertPopUp.alertViewStyle = UIAlertViewStylePlainTextInput; 
    self.alertTextField = [message textFieldAtIndex:0]; 
    self.alertTextField.keyboardType = UIKeyboardTypeAlphabet; 
    alertPopUp.delegate = self; 
    [alertPopUp show]; 
    [self.alertTextField becomeFirstResponder]; 

où alertTextField a été mis en place comme ceci:

@propery (nonatomic, strong) UITextField *alertTextField; 

vous pouvez accéder alertTextField dans la réponse de votre délégué:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 
    NSString *buttonTitle=[alertView buttonTitleAtIndex:buttonIndex]; 
    if([buttonTitle isEqualToString:@"Cancel"]) { 
     return; 
    } 
    else if([buttonTitle isEqualToString:@"Ok"]) { 
     NSLog(@"your text string is %@", self.alertTextField.text); 
    } 
} 

Vous pourriez aussi simplement donner l'alerteVoir une t ag, et comparez les numéros de tag, plutôt que de sauvegarder une référence en utilisant @property.

Questions connexes