2010-12-30 14 views
17

Sto cercando di ottenere il testo da una vista di avviso e aggiungerlo alla mia matrice mutabile per elencare in una vista tabella. Mi rendo conto che esiste una domanda simile che è stata pubblicata qualche mese fa, ma non capisco come utilizzare la risposta data.Ottenere testo da UIAlertView

-(IBAction)insert { 
    UIAlertView* dialog = [[UIAlertView alloc] init]; 
    [dialog setDelegate:self]; 
    [dialog setTitle:@"Enter Name"]; 
    [dialog setMessage:@" "]; 
    [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]; 
    [dialog show]; 

    [data addObject:[nameField text]]; 
    [mainTableView reloadData]; 

Tuttavia la mia app si blocca perché dice che sto tentando di inserire un oggetto nullo al indice 0. Che cosa sto facendo di sbagliato?

EDIT: Ok penso che mi manca un metodo per gestire la visualizzazione degli avvisi. Così ho trovato questo:

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

    } 

Ora ho solo bisogno di collegare i pezzi, ma non so come.

risposta

45

Un errore comune che le persone fanno quando si utilizza un UIAlertView è che pensano che inviarlo un messaggio show bloccherà il thread principale. Non è così. Il tuo codice continua a essere eseguito, anche se c'è un avviso sullo schermo. Così, non esiste alcun valore per la UITextField che avete passato in.

Quello che dovete fare è attuare il UIAlertViewDelegate nel vostro UIViewController per afferrare tutto ciò che un utente ha inserito nel campo di testo. Detto questo, devi ancora verificare il valore nil, perché se non inserisci nulla, il valore text sarà nil.

AGGIORNAMENTO: questa risposta è stata pubblicata prima che Apple creasse un'API per aggiungere un UITextField a un avviso tramite lo UIAlertViewStyle. Ecco il codice aggiornato, preso in prestito da @ Matt

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Enter Name" 
               message:@" " 
               delegate:self 
             cancelButtonTitle:@"Cancel" 
             otherButtonTitles:@"OK", nil]; 
alert.alertViewStyle = UIAlertViewStylePlainTextInput; 
[alert show]; 

Poi, nel UIAlertViewDelegate call back:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 
    if (buttonIndex == 1) { 
     NSString *name = [alertView textFieldAtIndex:0].text; 
     // Insert whatever needs to be done with "name" 
    } 
} 
+0

La mia app è un'applicazione basata su una finestra. Questo importa? – Snowman

+0

@ f-Prime No, non importa. Stiamo attraversando la gerarchia di UIAlertView. –

+0

Ok, quindi come dovrebbe essere il mio codice completo? Il mio metodo add, più il metodo clickkedButtonAtIndex, dovrebbe funzionare? Devo chiamare clickedButtonAtIndex nel mio metodo di aggiunta? Come è ora, non funziona – Snowman

0

– alertView:clickedButtonAtIndex: è un metodo delegato di UIAlertView. Basta aggiungere il metodo che hai definito nella tua modifica all'implementazione del controller e dovresti andare, dal momento che hai già impostato il controller come delegato di AlertView.

aggiungere anche per l'intestazione di classe, al fine di evitare eventuali avvisi relativi delegati, vale a dire:

@interface MyViewController : UIViewController <UIAlertViewDelegate> { 
... 
}; 

Non dimenticare di rimuovere [data addObject:[nameField text]]; e [mainTableView reloadData]; dal metodo di inserimento.

+0

Ok, l'ho fatto, ma ottengo un errore "nome non dichiarato" nel metodo clickedButtonAtIndex – Snowman

0
UIAlertView *myAlert = [[UIAlertView alloc] initWithTitle:@"Alert title" 
                message:@"alert message" 
               delegate:self 
             cancelButtonTitle:@"Cancel" 
             otherButtonTitles:@"Ok", nil]; 
[myAlert addTextFieldWithValue:nil label:@"<place holder>"]; 
[[myAlert textField] setTextAlignment:UITextAlignmentCenter]; 
[[myAlert textField] becomeFirstResponder]; 
[myAlert show]; 
[myAlert release]; 
myAlert = nil;    

Non c'è bisogno di aggiungere un campo di testo personalizzato. È possibile aggiungere direttamente utilizzando il metodo addTextFieldWithValue.

+0

UIAlertView non sembra avere un metodo 'addTextFieldWithValue: label:' –

3

Non provare ad aggiungere uno UITextView su un UIAlertView oppure Apple potrebbe rifiutare la tua app.

Ho già utilizzato lo stesso tipo di funzionalità nella mia app. Ma Apple RIFIUTATO LA MIA APP a causa dell'uso di UITextView in UIAlertView.

27

Non è necessario aggiungere la tua campo di testo al AlertView ma invece impostare lo stile appropriato

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Enter Name" 
               message:@" " 
               delegate:self 
             cancelButtonTitle:@"Cancel" 
             otherButtonTitles:@"OK", nil]; 
alert.alertViewStyle = UIAlertViewStylePlainTextInput; 
[alert show]; 

Poi accedere al testo inserito dopo l'OK (tasto 1) è stato premuto

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    if (buttonIndex == 1) { 
     NSString *name = [alertView textFieldAtIndex:0].text; 
     // name contains the entered value 
    } 
} 
+0

Nota: funziona solo su iOS5 + –