iPhone code snippet: UIAlertView

La classe UIAletrView permette di mostrare una finestra modale (animata) per informare e/o chiedere qualcosa all’utente. Le UIAlterView (viste alert) sono molto comode e semplici da usare. Anche la gestione della risposta utente viene risolta intercettando l’indice del bottone premuto. Per visualizzare un semplice UIAlterView basta scrivere:

1
2
3
4
// semplice Alert con un bottone, senza callback
UIAlertView *myAlert = [[UIAlertView alloc] initWithTitle:@"Titolo" message:@"Messaggio" cancelButtonTitle:@"Annulla" otherButtonTitles: nil];
[myAlert show];
[myAlert release];

E’ possibile aggiungere ulteriori bottoni in otherButtonTitles:

1
2
3
4
// semplice Alert con due bottoni, senza callback
UIAlertView *myAlert = [[UIAlertView alloc] initWithTitle:@"Titolo" message:@"Messaggio" cancelButtonTitle:@"Annulla" otherButtonTitles:@"Ok", nil];
[myAlert show];
[myAlert release];

Per determinare quale bottone è stato premuto, basta aggiungere la delegate:self nell’inizializzazione dell’oggetto UIAlterView:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// semplice Alert con due bottoni e callback
UIAlertView *myAlert = [[UIAlertView alloc] initWithTitle:@"Titolo" message:@"Messaggio" delegate:self cancelButtonTitle:@"Annulla" otherButtonTitles:@"Ok", nil];
[myAlert show];
[myAlert release];

// la callback ha questa sintassi

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    switch ( buttonIndex ) {
        case 1:
            // codice
            break;
    }
}

La callback alertView deve avere necessariamente quel nome; per maggiori informazioni vedi UIAlertViewDelegate

Avendo a disposizione solo la callbck alertView:clickedButtonAtIndex, più UIAletrView punteranno sempre a quella. Utilizzando il campo tag dell’oggetto UIAletrView, possiamo determinare quale sia il “chiamante”:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// semplice Alert con due bottoni e callback
UIAlertView *myAlert = [[UIAlertView alloc] initWithTitle:@"Titolo" message:@"Messaggio" delegate:self cancelButtonTitle:@"Annulla" otherButtonTitles:@"Ok", nil];
myAlertA.tag = 1;
[myAlertA show];
[myAlertA release];

//
UIAlertView *myAlertB = [[UIAlertView alloc] initWithTitle:@"Titolo" message:@"Messaggio" delegate:self cancelButtonTitle:@"Annulla" otherButtonTitles:@"Ok", nil];
myAlertA.tag = 2;
[myAlertB show];
[myAlertB release];

// gestione multipla UIAlertView

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    NSLog(@"Alert Tag: %i", alertView.tag);
    NSLog(@"buttonIndex: %i", buttonIndex);
}
  • Corninos

    Ciao ho una domanda..
    io ho copiato la tua riga di codice( quella dell’ultima finestra)
    ma mi da quest’errore:

    error: 'alertView' undeclared (first use in this function)
    error: expected ';' before ':' token

    Whi?

  • http://www.undolog.com Giovambattista Fazioli

    @Corninos: nel file .h della tua classe (non so dove hai inserito il codice) devi inserire il prototipo della funzione, ovvero:

    1
    - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex;

    Inoltre, attento, che potresti aver commesso un qualche errore di battitura. Se necessario incollami l’intero tuo codice o inviamelo per email.

  • Corninos

    Ciao ti ringrazio per avermi risposto e alla fine avevo all’interno un errore di battitura o copiatura.
    All’interno della seconda alertView hai scritto:

    1
    myAlterA.tag = 2;

    e non funzionava allora l’ho corretto in:

    1
    myAlterB.tag = 2;

    e tutto sembra funzionare..
    Ora io ti faccio un’altra domanda “stupida”: ma se io volessi cambiare il colore dello sfondo di un pulsante o etichetta.. o anche solo il titolo di un pulsante come devo fare? io ho provato:

    1
    pulsante.title = @"nuovotitolo";

    ma non funziona, poi ho provato

    1
    [pulsante setTitleLabel:@nuovotitolo"];

    ti ringrazio anticipatamente!

  • http://www.undolog.com Giovambattista Fazioli

    @Corninos: in realtà mezza colpa è mia: mi sono accorto che avevo scritto Alter invece di Alert (dislessia :) ho corretto il codice nel post). Per i titoli e lo stile dei bottoni, se ti riferisci all’UIAlertView, puoi modificare la label durante la creazione dell’UIAlertView, agendo su cancelButtonTitle e otherButtonTitles ma non puoi alterare lo stile, essendo elementi di sistema.
    A meno che non ti riferisci ad un bottone semplice UIButton… se ho capito bene la domanda?!

  • Corninos

    @Giovambattista Fazioli:
    io mi riferifo ad un bottone generico.. UIButton è un OFF-TOPIC..

  • http://www.undolog.com Giovambattista Fazioli

    @Corninos: se ti riferisci ad un bottone UIButton la label si cambia così:

    1
    [pulsante setTitle:@"Nuova Label" forState:UIControlStateNormal];

    Lo sfondo, invece, puoi modificarlo in questo modo, anche se dipende da che tipo di bottone stai usando:

    1
    [pulsante setBackgroundColor:[UIColor redColor]];