2009-08-11 6 views
9

He subclases UIActionSheet, y en el método -init, tengo que añadir los botones de forma individual después de llamar a los súper init (no se puede pasar una var_args).UIActionSheet addButtonWithTitle: no añadir botones en el orden correcto

En este momento, parece que esto:

if (self = [super initWithTitle:title delegate:self cancelButtonTitle:cancel destructiveButtonTile:destroy otherButtonTitles:firstButton,nil]) { 
    if (firstButton) { 
    id buttonTitle; 
    va_list argList; 
    va_start(argList, firstButtton); 
    while (buttonTitle = va_arg(argList, id)) { 
     [self addButtonWithTitle:buttonTitle] 
    } 
    va_end(argList); 
    } 
} 
return self; 

Sin embargo, mi uso específico en este caso no tiene botón destructiva, un botón de cancelación, y otros cuatro botones. Cuando se muestra, el orden es todo apagado, apareciendo como

Button1
Cancelar
Botón2
Button3

Al igual que simplemente fueron añadidos al final de la lista, lo cual tiene sentido; sin embargo, NO QUIERO que se vea así; ¿entonces qué hago? ¿Hay alguna forma de subclasificar UIActionSheet correctamente y hacer que esto funcione?

Respuesta

21

Puede simplemente agregarlos en el orden correcto y luego configurar manualmente cancelButtonIndex y destructiveButtonIndex.

Para su código de ejemplo: es correcto, sin embargo no es necesario

if (self = [super initWithTitle:title delegate:self cancelButtonTitle:nil destructiveButtonTile:nil otherButtonTitles:nil]) { 
    if (firstButton) { 
    id buttonTitle; 
    int idx = 0; 
    va_list argList; 
    va_start(argList, firstButtton); 
    while (buttonTitle = va_arg(argList, id)) { 
     [self addButtonWithTitle:buttonTitle] 
     idx++; 
    } 
    va_end(argList); 
    [self addButtonWithTitle:cancel]; 
    [self addButtonWithTitle:destroy]; 
    self.cancelButtonIndex = idx++; 
    self.destructiveButtonIndex = idx++; 
    } 
} 
return self; 
+1

Ah, eso lo hace más fácil. Pensé que eran de solo lectura –

+4

Buena respuesta, pero el contador es realmente innecesario. addButtonWithTitle: devuelve el índice que también se agregó. –

8

respuesta de Aviad Ben Dov el contador de índice de botón para ajustar el índice para los índices de destruir y anular. El addButtonWithTitle: método devuelve el índice del botón recién utilizado por lo que podemos utilizar ese valor inmediato de este modo:

if (self = [super initWithTitle:title delegate:self cancelButtonTitle:nil destructiveButtonTile:nil otherButtonTitles:nil]) { 
    if (firstButton) { 
    id buttonTitle; 
    va_list argList; 
    va_start(argList, firstButtton); 
    while (buttonTitle = va_arg(argList, id)) { 
     [self addButtonWithTitle:buttonTitle] 
    } 
    va_end(argList); 
    self.cancelButtonIndex = [self addButtonWithTitle:cancel]; 
    self.destructiveButtonIndex = [self addButtonWithTitle:destroy]; 
    } 
} 
return self; 
+0

Creo que su botón destruir no está en la ubicación correcta. Debería estar en la parte superior. – lhunath

3

Las respuestas anteriores causan el botón destructivo para ser colocado en la parte inferior, que no está de acuerdo con el HIG, y que también es muy confuso para el usuario. El botón destructivo debería estar en la parte superior, la cancelación en la parte inferior y las otras en el medio.

Las siguientes órdenes correctamente:

sheetView   = [[UIActionSheet alloc] initWithTitle:title delegate:self 
             cancelButtonTitle:nil destructiveButtonTitle:destructiveTitle otherButtonTitles:firstOtherTitle, nil]; 
if (otherTitlesList) { 
    for (NSString *otherTitle; (otherTitle = va_arg(otherTitlesList, id));) 
     [sheetView addButtonWithTitle:otherTitle]; 
    va_end(otherTitlesList); 
} 
if (cancelTitle) 
    sheetView.cancelButtonIndex  = [sheetView addButtonWithTitle:cancelTitle]; 

Ver https://github.com/Lyndir/Pearl/blob/master/Pearl-UIKit/PearlSheet.m para una aplicación (un envoltorio UIActionSheet con un API basado en bloques).

Cuestiones relacionadas