2009-04-13 7 views
8

Quiero desactivar los botones en la hoja de UIAction y habilitarlos después de que cierta condición sea verdadera. ¿Cómo logro esto? ¿Algunas ideas?iPhone Desactivar botones de UIActionSheet

+4

Sé que es difícil cambiar la opinión de alguien, pero ¿estás seguro de que realmente quieres hacerlo de esa manera? Quizás, en cambio, solo quiera mostrar la hoja de acción sin los botones que están deshabilitados, y cuando alguna condición sea verdadera, muestre la otra en su lugar (ocultando la otra si es necesario) –

+0

Vea una respuesta alternativa que agrego de numerosas fuentes en esta [respuesta SO ] (http://stackoverflow.com/a/9380142/100017) – Reuven

Respuesta

2

¿Hay una circunstancia que puede cambiar, mientras la hoja de acción está abierta, que podría hacer que el botón se active? Si no, creo que el mejor enfoque es alterar los botones que muestra la hoja en función de su condición.

De lo contrario, la única forma de manejar esto es recorrer las subvistas de la hoja, como dijo Craig, y buscar los objetos UIButton. Sin embargo, tendría cuidado con el uso del título del botón, porque el título podría (y debería) ser localizado para diferentes idiomas. Entonces las comparaciones contra el título no son tan confiables. Como no creó el botón, realmente no sabe qué tag o action de cada botón serían, tampoco, así que eso es un poco difícil también.

Presumiblemente, los botones aparecerán en la matriz subviews en el orden en que se especificó al UIActionSheet, pero como esto no está documentado, no hay garantía de que van a aparecer en este orden o que continuarán apareciendo en ese orden en futuras versiones del Cocoa Touch SDK. Por eso, me preocuparía principalmente que me rechacen en la App Store por usar una funcionalidad no documentada.

+0

No se rechazará de la Tienda de aplicaciones para este procedimiento. Siempre existe la posibilidad de que Apple cambie el orden de la subvista, y su aplicación podría comenzar a actuar de forma extraña, pero no es el tipo de "funcionalidad no documentada" que prohibirían en la tienda. –

+2

Es cierto que no es lo mismo que una API privada, pero es privada en el sentido de que está basada en experimentos, no en documentación. Recomiendo encarecidamente que no lo haga. No estoy seguro de que Apple no lo rechace, el acuerdo les da una mano libre para rechazar aplicaciones por cualquier motivo. – Alex

0

Si agrega la vista a la hoja de acciones, la vista no recibirá ningún evento. Necesita ver la supervista de la hoja de acciones.

Véase a continuación la forma en que he añadido un botón con retoque evento:

- (void)didPresentActionSheet:(UIActionSheet *)actionSheet{ 
CGRect rect = CGRectMake(0,0, 320, 480); 
UIButton* anImage = [[UIButton alloc] init]; 
[anImage setTitle:@"GHello worl" forState:UIControlStateNormal]; 
[anImage setTitle:@"GHello worl dfasd" forState:UIControlStateHighlighted]; 
[anImage setTitle:@"GHello worl selected" forState:UIControlStateSelected]; 
//[anImage setBackgroundImage:[UIImage imageNamed:@"photo.png"] forState:UIControlStateNormal]; 
[anImage addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside]; 
rect = CGRectMake(0,0, 320, 220); 
anImage.frame =rect; 


[actionSheet.superview addSubview:anImage]; 



[anImage release]; 

}

8

encontré que la respuesta de Craig no funcionaba para mí (en OS 3.1). Después de un poco de excavar alrededor descubrí que los subvistas de UIActionSheet son en realidad de una clase indocumentadoUIThreePartButton

De todos modos, esto funciona para mí (implementados como parte del método UIActionSheetDelegete)

- (void)willPresentActionSheet:(UIActionSheet *)actionSheet // before animation and showing view 
{ 
    for (UIView* view in [actionSheet subviews]) 
    { 
     if ([[[view class] description] isEqualToString:@"UIThreePartButton"]) 
     { 
      if ([view respondsToSelector:@selector(title)]) 
      { 
       NSString* title = [view performSelector:@selector(title)]; 
       if ([title isEqualToString:@"Button 1"] && [view respondsToSelector:@selector(setEnabled:)]) 
       { 
        [view performSelector:@selector(setEnabled:) withObject:NO]; 
       } 
      } 
     } 
    } 
} 

Espero que ayude alguien más, aunque me haría eco de la pregunta de Ed Marty sobre si sería mejor simplemente omitir estos botones de la hoja de acción por completo en lugar de hacer esto. Como siempre, al usar las características no documentadas, existe el riesgo de rechazo de la tienda de aplicaciones, aunque este código está escrito para fallar correctamente si Apple vuelve a utilizar las API en una futura versión del sistema operativo.

+6

Nunca use 'description' para comparar clases. La forma correcta es usar use '[view isKindOfClass: NSClassFromString (@" UIThreePartButton ")]' – Kornel

+4

Usar clases no documentadas como esta es una manera segura de ser rechazado cuando se envía a App Store. – PeyloW

1

UIActionSheet no está destinado a la personalización. Debería mostrar el conjunto real de opciones disponibles. No debería cambiar la disponibilidad del botón mientras esté en la parte superior. Simplemente quite los botones no utilizados, o use la vista personalizada en su lugar

0

Me enfrenté a un problema similar cuando tenía una hoja de acción que cambia en función de algunas condiciones. Olvidé por completo las opciones que no son aplicables de la hoja de acción, pero en algunos casos termino con una hoja de acción con solo una opción. Esto parece un poco tonto, ya que podría activar esa opción inmediatamente sin mostrar la hoja en absoluto.

Sin embargo, también quiero que los usuarios aprendan que al hacer clic en un botón determinado en la pantalla les da una lista de las opciones que pueden elegir. Es por eso que quiero mostrar la hoja de acción también en los casos en que solo tiene una opción.Pensé en deshabilitar las opciones no aplicables en lugar de omitirlas de la hoja, pero tampoco me parecía bien.

Mi caso está relacionado con tener un icono de usuario en una barra inferior de encargo y presionándola presenta las siguientes opciones:

  • si conectado
    • Mi Perfil
    • Cerrar sesión
  • si no conectado en
    • Acceder
1

Esto es probablemente un poco tarde. Pero, la forma en que descubrí es crear UIButton (s) y agregarlos a la subvista UIActionSheet. Asegúrese de que estos botones estén en la parte superior y cubra por completo los botones UIActionSheet predeterminados para reemplazar. Cuando el UIButton se coloca sobre el botón predeterminado UIActionSheet, su UIResponder tiene prioridad sobre UIActionSheet button UIResponder. Entonces, al hacerlo, puede deshabilitar y habilitar esos botones como quiera en cualquier parte de su lógica UIViewController. Esta puede ser una alternativa para acceder a los métodos privados del SDK (como anteriormente, UIThreePartButton) y Apple podría rechazar su aplicación. Creo que esto sigue las pautas de Apple.

es decir, UIButtons de instalación para habilitar/deshabilitar después de que se den ciertas condiciones.

// Instantiate once within a method 
if (self.actionSheet==nil) { 
    UIActionSheet *as = [[UIActionSheet alloc] 
         initWithTitle:@"" 
         delegate:self 
         cancelButtonTitle:@"Cancel" 
         destructiveButtonTitle:@"Load Data" 
         otherButtonTitles:@"Update Data",nil]; 

    //[actionSheet showInView:self.view]; 
    self.loadUIButton.frame = CGRectMake(24.0f,25.0f,275.f,46.0f); 
    [as addSubview: self.loadUIButton]; 
    self.updateUIButton.frame = CGRectMake(24.0f,78.0f,275.f,46.0f); 
    [as addSubview: self.updateUIButton]; 
    //[actionSheet addSubview: self.cancelUIButton]; 
    //[as showFromToolbar: self.navigationController.toolbar]; 
    self.actionSheet = as; 
    [as release]; 
} 
[self.actionSheet showFromToolbar: self.navigationController.toolbar]; 

NOTA: Esto funcionó perfectamente en una aplicación anterior que construí.

0

Usted podría tratar de [actionSheet valueForKey: @ "_ botones"] en su UIActionSheetDelegate así:

- (void)willPresentActionSheet:(UIActionSheet *)actionSheet 
{ 
    for (UIButton *btn in [actionSheet valueForKey:@"_buttons"]) 
    { 
     [btn setBackgroundImage:[UIImage imageNamed:@"btnActionSheetUp.png"]  forState:UIControlStateNormal]; 
     [btn setBackgroundImage:[UIImage imageNamed:@"btnActionSheetDown.png"] forState:UIControlStateHighlighted]; 
    } 
} 

Esperemos que este planteo cambio en futuras versiones del SDK.

+0

¿Esto va a ser rechazado? En caso de que tenga muchos botones, UIActionSheet configurará un desplazamiento con los botones, y luego, esto no funciona, ¿sabe cómo resolverlo? ¡Gracias! – Oscar

Cuestiones relacionadas