style alertas iphone cocoa-touch uialertview

iphone - alertas - uialertcontroller styles



¿Es posible NO descartar un UIAlertView (5)

Sí. Subclase UIAlertView y luego sobrecarga -dismissWithClickedButtonIndex:animated: por ej.

@implementation MyAlertView -(void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated { if (buttonIndex should not dismiss the alert) return; [super dismissWithClickedButtonIndex:buttonIndex animated:animated]; } @end

Extraoficialmente puedes definir un

-(void)alertSheet:(UIAlertSheet*)sheet buttonClicked:(id)button;

método para el delegado que lo hará pasar por alto -dismissWithClickedButtonIndex:animated: pero no está documentado , por lo que no sé si es adecuado para usted.

El protocolo UIAlertviewDelegate tiene varios métodos opcionales que incluyen:

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

Esto parecería sugerir que no todos los clics de botón realmente descartan la vista de alerta. Sin embargo, no veo forma de configurar la vista de alerta para que NO se cierre automáticamente presionando ningún botón.

¿Tengo que crear una subclase para lograr esto?

¿Por qué el protocolo UIAlertViewDelegate tiene:

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex; - (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex

Y

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

Si no admitió opcionalmente no descartar la vista de alerta con cada botón, haga clic en?

Breve aparte: me doy cuenta de lo que UIAlertView fue diseñado. Pero mi propósito es permitir que el usuario copie algún texto en la placa de pegado antes de que la aplicación salga (lo que sucede automáticamente cuando se descarta la vista de alerta).


willPresentAlertView: didPresentAlertView: alertView:willDismissWithButtonIndex: y alertView:didDismissWithButtonIndex: son para rastrear el inicio y el final de las animaciones de UIAlertView.

Las aplicaciones que no necesitan seguir las animaciones de UIAlertView simplemente pueden usar alertView:clickedButtonAtIndex: Los documentos para ese método dicen "el receptor se descarta automáticamente después de que se invoca este método".


ADVERTENCIA

De algunas fuentes he oído que algunas aplicaciones han sido rechazadas siguiendo este proceso. Tuve suerte en mi caso durante iOS6, así que estoy mostrando el código aquí. Utilice bajo su propio riesgo: - /

Subclases es la mejor manera. Cree una bandera bool para que la alerta permanezca o no.

Esta es la Subclase de UIAlertView

// // UICustomAlertView.h // #import <UIKit/UIKit.h> @interface UICustomAlertView : UIAlertView { } @property(nonatomic, assign) BOOL dontDisppear; @end // // UICustomAlertView.m // #import "UICustomAlertView.h" @implementation UICustomAlertView - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // Initialization code } return self; } -(void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated { if(self.dontDisppear) return; [super dismissWithClickedButtonIndex:buttonIndex animated:animated]; } @end

Y así es como lo usé en mi código

if(![txtUsername.text isEqualToString:@"admin"] && ![txtPassword.text isEqualToString:@"admin"]) { alertLogin.dontDisppear = YES; alertLogin.message = NSLocalizedString(@"my_alert", nil); } else { alertLogin.dontDisppear = NO; // proceed }


#import "MLAlertView.h" @implementation MLAlertView -(void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated { } -(void)dismissNow:(NSInteger)buttonIndex { [super dismissWithClickedButtonIndex:buttonIndex animated:YES]; }


En mi opinión: no hay razón para mantener la alerta. Incluso si quiere quedárselo, solo piense en "volver a mostrarlo", manteniendo una referencia, luego llame a [alertView show] ==> NO HAY NECESIDAD DE SUBCLASE CUALQUIER COSA . Buenas noticias, ¿eh?