web-dev-qa-db-fra.com

Uitextfield in uialertview sur iPhone - Comment le rendre réactif?

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

24
user21293

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.

31
user21293

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]);
}
49
chunkyguy
14
Adam Ernst

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];
6
squelart

Trouvé plus de solution claire. Vérifiez ce code SNIPPET: Nom d'utilisateur et mot de passe Uitextfields dans l'invite UialertView

3
slatvick
2
gonso

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);
}
1
neoneye

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;
}
1
adam

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

0
Maximilian Litteral

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.

0
driedler