2013-10-01 2 views
7

Ho un UIAlertView con 3 pulsanti visualizzati verticalmente per impostazione predefinita in UIAlertView. Mi piacerebbe che il pulsante in alto fosse in grassetto/evidenziato. Dalla mia comprensione e test, il pulsante 'cancella' è quello che viene evidenziato. Il problema non è importante come ho impostato il pulsante Annulla, è posizionato per ultimo in questa riga. Non riesco a farlo diventare il primo pulsante.Evidenzia pulsante superiore in UIAlertView

Ho provato a installare il pulsante di annullamento in modo esplicito

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title 
               message:message 
               delegate:self 
             cancelButtonTitle:@"Top Button" 
             otherButtonTitles:@"Middle Button", @"Bottom Button", nil]; 

così come l'impostazione l'indice del pulsante di annullamento

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title 
                 message:message 
                 delegate:self 
              cancelButtonTitle:nil 
              otherButtonTitles:@"Top Button", @"Middle Button", @"Bottom Button", nil]; 
alert.cancelButtonIndex = 0; 

risposta

8

Questo problema è effettivamente causato da cambiamenti Apple ha fatto in iOS 7. Prima di iOS 7, siamo stati in grado di accedere alle sottoview di un numero UIAlertView chiamando lo [alertView subviews]. Ma dal momento che iOS 7 non ci dà accesso a nessuna sottoview ([alertView subviews].count restituirà sempre zero) non possiamo personalizzare UIAlertViews nel modo in cui eravamo abituati.

Quindi, l'unico modo per raggiungere l'obiettivo in iOS 7 è creare una visualizzazione personalizzata simile a UIAlertView e quindi personalizzarla come preferisci.

Ma se siete alla codifica per una versione iOS prima di iOS 7 di quanto si potrebbe usare questo semplice trucco per accedere a un tasto:

UIAlertView *alertView = [[UIAlertView alloc] init]; 
[alertView addButtonWithTitle:@"Yes"]; 
UIButton *yesButton = [alertView.subviews lastObject]; //is nil under iOS 7 

In questo modo si otterrebbe l'accesso al primo pulsante. Dopodiché puoi personalizzare il tuo UIAlertView come al solito.

A proposito: Apple non voleva solo dare a tutti gli UIAlertView lo stesso design cambiando il modo in cui possiamo personalizzarli. La ragione risiede nelle ricerche HCI (Human-Computer-Interaction). Le persone tendono a pensare che il pulsante in basso sia sempre la risposta 'predefinita' se questo è il modo in cui viene implementato in tutte le app.
Anche il pulsante in basso è il pulsante evidenziato solo in un UIAlertView. Quindi il suo peso visivo è più forte del peso visivo del pulsante con circa la stessa quantità di testo. Questo è un altro fattore per cui le persone tendono a scegliere questo. E questo è anche il motivo per cui il pulsante evidenziato non dovrebbe mai causare azioni disastrose e irreversibili ("Vuoi eliminare tutti i tuoi giochi salvati" dovrebbe sempre evidenziare il pulsante "Mantieni i miei giochi salvati" e non quello che dice "Elimina tutto").
Pertanto, Apple crea sempre lo Cancel Button quello inferiore, indipendentemente dall'ordine in cui sono stati aggiunti i pulsanti. Pertanto, se la tua app non utilizza un'interfaccia completamente personalizzata e utilizza molti elementi dell'interfaccia utente forniti da Apple, ti consiglio vivamente di non provare a modificare tale comportamento e di rendere il pulsante in basso il pulsante "predefinito".

+0

Si noti che la modifica della gerarchia delle viste di avviso è sempre stata dichiarata privata e quindi vietata. Quindi può portare al rifiuto durante il processo di revisione di AppStore. – vikingosegundo

+0

Il tuo punto sull'HCI ha molto senso e ho capito che è per questo che Apple non ti lascia cambiare nulla. A mio parere, tuttavia, sono attratto dal pulsante in alto, motivo per cui stavo cercando di cambiarlo. Grazie per la spiegazione. –