J'ai placé un Uitextfield dans une vue UialertView et j'ai déplacé pour que le clavier ne couvrait pas le code suivant:
[dialog setDelegate:self];
[dialog setTitle:@"Enter Name"];
[dialog addButtonWithTitle:@"Cancel"];
[dialog addButtonWithTitle:@"OK"];
UITextField * nameField = [[UITextField alloc] initWithFrame:CGRectMake(20.0, 45.0, 245.0, 25.0)];
[nameField setBackgroundColor:[UIColor whiteColor]];
[dialog addSubview:nameField];
CGAffineTransform moveUp = CGAffineTransformMakeTranslation(0.0, 100.0);
[dialog setTransform: moveUp];
[dialog show];
J'ai aussi le code suivant pour faire face à la vue Alerte:
- (void) alertView:(UIAlertView *)alert clickedButtonAtIndex:(NSInteger)buttonIndex{
NSLog(@"%d", (int) buttonIndex);
if (buttonIndex == 1) { // OK pushed
NSLog([alert textField].text); // does not log anything
} else {
// Cancel pushed
}}
J'ai aussi un fichier uialertviewext.h qui contient:
@class UITextField, UILabel;
@interface UIAlertView(Extended)
-(UITextField *)textField;
@end
Ma question est de savoir comment puis-je entrer le texte de l'utilisateur et comment puis-je rejeter le clavier?
Merci, ben
Pour ceux qui peuvent s'en soucier, voici une solution de travail:
UIAlertView* dialog = [[UIAlertView alloc] init];
[dialog setDelegate:self];
[dialog setTitle:@"Enter Name"];
[dialog setMessage:@" "];
[dialog addButtonWithTitle:@"Cancel"];
[dialog addButtonWithTitle:@"OK"];
nameField = [[UITextField alloc] initWithFrame:CGRectMake(20.0, 45.0, 245.0, 25.0)];
[nameField setBackgroundColor:[UIColor whiteColor]];
[dialog addSubview:nameField];
CGAffineTransform moveUp = CGAffineTransformMakeTranslation(0.0, 100.0);
[dialog setTransform: moveUp];
[dialog show];
[dialog release];
[nameField release];
Assurez-vous que vous avez créé Uitextfield * Namefield; Dans votre fichier .h, vous pouvez obtenir au texte de l'utilisateur saisi en faisant: INPUTTEXT = [Texte de nom de référence];
en alerte VOID) alerte: (UIALERTERVIEW *) ALERTER CLICKEDBUTTONATINDEX: (NSInteger) Méthode BottonIndex.
--- (Note importante : pour iOS 4.0+, le CGAffineTransform
est effectué automatiquement afin que vous puissiez laisser ce bit si vous ne ciblez que 4.0+. Sinon, vous devrez vérifier quel OS vous êtes sur et le gérer en conséquence.
Toute personne soutenant iOS 5.0 à partir d'ARC, il y a cette propriété directe d'Alertviewstyle que vous pouvez définir:
-(void)showAlertWithTextField{
UIAlertView* dialog = [[UIAlertView alloc] initWithTitle:@"Enter Name" message:@"" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Add", nil];
[dialog setAlertViewStyle:UIAlertViewStylePlainTextInput];
// Change keyboard type
[[dialog textFieldAtIndex:0] setKeyboardType:UIKeyboardTypeNumberPad];
[dialog show];
}
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
if (buttonIndex == 1)
NSLog(@"%@",[[alertView textFieldAtIndex:0]text]);
}
Ça vaut la peine de vérifier
Pour une solution complète et complète.
Un moyen simple de localiser le champ de texte, sans tenir une référence explicite, est de définir sa balise:
nameField.tag = ALERTVIEW_NAMEFIELD;
Assurez-vous qu'il est différent de 0 et des autres balises d'objet UIView
Vous pouvez avoir, y compris la boîte de dialogue Parent!
Puis à l'intérieur de alertView:clickedButtonAtIndex:
Handler, vous pouvez récupérer votre champ de texte de cette façon:
UITextField *nameField = (UITextField *)[alertView viewWithTag:ALERTVIEW_NAMEFIELD];
Trouvé plus de solution claire. Vérifiez ce code SNIPPET: Nom d'utilisateur et mot de passe Uitextfields dans l'invite UialertView
Découvrez cette implémentation: https://github.com/josecasttillo/egotextFieldAllertView
Ceci est pour iOS5 et ARC.
-(void)showAlert {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"New Album"
message:@"Enter a name for the album."
delegate:self
cancelButtonTitle:@"Cancel"
otherButtonTitles:@"Save", nil];
alertView.alertViewStyle = UIAlertViewStylePlainTextInput;
UITextField* textfield = [alertView textFieldAtIndex:0];
textfield.placeholder = @"Title";
[alertView show];
}
-(void)alertView:(UIAlertView *)alertView
didDismissWithButtonIndex:(NSInteger)buttonIndex
{
if (buttonIndex != 1) {
NSLog(@"Cancel");
return;
}
UITextField* textfield = [alertView textFieldAtIndex:0];
NSLog(@"Save. text: %@", textfield.text);
}
Une bonne approche est une excellente approche, vous pouvez utiliser les méthodes de déléguée de l'UITEXTFIELDELEGATE pour déplacer la boîte de dialogue uniquement lorsque le clavier est activé. Voir ci-dessous.
- (void)textFieldDidBeginEditing:(UITextField *)textField {
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
[UIView setAnimationDelegate:self];
CGAffineTransform moveUp = CGAffineTransformMakeTranslation(0.0, -20);
[dialog setTransform: moveUp];
[UIView commitAnimations];
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
[UIView setAnimationDelegate:self];
CGAffineTransform moveDown = CGAffineTransformMakeTranslation(0.0, 0.0);
[dialog setTransform: moveDown];
[textField resignFirstResponder];
return YES;
}
Ceci est en fait seulement 1 autre ligne dans le code UialertView régulier. J'espère que cela t'aides!
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"test" message:@"This is a alert with a textfield" delegate:self cancelButtonTitle:@"YAY" otherButtonTitles:nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
[alert show];
[alert release];
ne fonctionne que sur iOS 5 ou plus tard
Voudrais ajouter un Tweak mineur à la réponse de IwasRobbed:
genericalertDialogs.m :
+ (void)displayInputDialog:(NSString*)title delegate:(id<UIAlertViewDelegate>)delegate textFiled:(UITextField*)txtField
{
UIAlertView* dialog = [[UIAlertView alloc] init];
[dialog setDelegate:delegate];
[dialog setTitle:title];
[dialog setMessage:@" "];
[dialog addButtonWithTitle:@"Cancel"];
[dialog addButtonWithTitle:@"OK"];
if(UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation]))
{
txtField.frame = CGRectMake(20.0, 45.0, 245.0, 25.0);
}
else
{
txtField.frame = CGRectMake(20.0, 30.0, 245.0, 25.0);
}
[txtField becomeFirstResponder];
[txtField setBackgroundColor:[UIColor whiteColor]];
[dialog addSubview:txtField];
[dialog show];
}
n autre fichier .m (implémente uialertviewelegate
self->txtChangeName = [[UITextField alloc] init];
[GenericAlertDialogs displayInputDialog:@"Some title...:"
delegate:self
textFiled:txtChangeName];
La manipulation du protocole UialertViewElementegate:
- (void) alertView:(UIAlertView *)alert clickedButtonAtIndex:(NSInteger)buttonIndex
{
if(buttonIndex == 1)
{
if([txtChangeName.text length] > 0)
{
self->userInput = [txtChangeName text];
}
}
self->txtChangeName = nil;
}
iOS 4+ conformes.