uialert style objective ios uialertview ios8 uialertcontroller

style - UIAlertController si iOS 8, de lo contrario UIAlertView



uialertcontroller swift 4 (11)

Quiero ajustarme al UIAlertController utilizado en iOS 8 ya que UIAlertView ahora está en desuso. ¿Hay alguna forma en que pueda usar esto sin romper el soporte para iOS 7? ¿Hay algún tipo de condición que pueda hacer para comprobar si iOS 8 hace otra cosa para el soporte de iOS 7?


Método uno

Por la versión del sistema iOS

#define iOSVersionLessThan(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending) // below ios8 ,create UIAlertView if(iOSVersionLessThan(@"7.0")){ // todo // ios8 and above ,UIActionController avaliable }else{ // todo }

Método dos

por detección de características del sistema

// create UIActionController if([UIActionController class]){ // todo // create UIAlertView }else{ // todo }

Pero, hay una tercera PSTAlertController llamada PSTAlertController que trata con versiones anteriores compatibles con iOS 7 de UIActionSheet y UIAlertView.

ref a


Como otros ya han mencionado, siempre verifique si existe una característica. Creo que el enfoque más seguro es el siguiente:

if (NSClassFromString(@"UIAlertController")) { // use UIAlertController } else { // use UIAlertView }

Con el riesgo obvio de ingresar un nombre de clase con un error tipográfico. :)

De la documentación de NClassFromString :

[Devoluciones] El objeto de clase nombrado por aClassName, o nil si no hay ninguna clase con ese nombre cargada actualmente. Si aClassName es nil, devuelve nil.

Disponibilidad de iOS (2.0 y posteriores)


Creo que una forma mucho mejor de comprobar si existe una clase (desde iOS 4.2) es:

if([ClassToBeChecked class]) { // use it } else { // use alternative }

En tu caso, eso sería:

if ([UIAlertController class]) { // use UIAlertController } else { // use UIAlertView }


He creado un contenedor muy simple en Objective-C, que admite tanto UIAlertView de iOS antiguo como UIAlertViewController nuevo

https://github.com/MartinPerry/UIAlert/

También trae el nuevo uso de bloques de acción al antiguo UIAlertView

Muestra:

MyAlertMessage * a = [[MyAlertMessage alloc] initWithTitle:@"Hello" WithMessage:@"World"]; [a addButton:BUTTON_OK WithTitle:@"OK" WithAction:^(void *action) { NSLog(@"Button OK at index 0 click"); }]; [a addButton:BUTTON_CANCEL WithTitle:@"Cancel" WithAction:^(void *action) { NSLog(@"Button Cancel at index 1 click"); }]; [a show];


He escrito una clase que envuelve el UIAlertView y usa UIAlertController. Para el programador es transparente por lo tanto es suficiente importar estas clases en el proyecto. La utilidad de estas clases es cuando en un proyecto anterior hay más UIAlertView para cambiar. Enlace: https://github.com/kennymuse/UIAlertView


Intenta debajo del código. Funciona bien tanto para iOS 8 como para la versión inferior.

if (IS_OS_8_OR_LATER) { UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:title message:msg preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) { }]; [alertVC addAction:cancelAction]; [[[[[UIApplication sharedApplication] windows] objectAtIndex:0] rootViewController] presentViewController:alertVC animated:YES completion:^{ }]; } else{ UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:msg delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil]; [alert show]; }


Objetivo C (como se mencionó anteriormente)

if ([UIAlertController class]) { // use UIAlertController } else { // use UIAlertView }

Rápido

if objc_getClass("UIAlertController") == nil { // use UIAlertView } else { // use UIAlertController }

No utilice if NSClassFromString("UIAlertController") == nil No funciona porque la firma para este método es func NSClassFromString(_ aClassName: String!) -> AnyClass!


Por favor vea la respuesta de Erwan (debajo de mi respuesta) ya que veo que es la mejor.

-

Puedes verificar la versión de iOS para usar el control apropiado como este:

if (([[[UIDevice currentDevice] systemVersion] compare:@"8.0" options:NSNumericSearch] == NSOrderedAscending)) { // use UIAlertView } else { // use UIAlertController }


Crear una utility function simple para reducir el código.

CÓDIGO:

// pass minimum required iOS version BOOL isOSSupported(NSString *minRequiredVersion) { NSString *currSysVer = [[UIDevice currentDevice] systemVersion]; BOOL isOSSupported = ([currSysVer compare:minRequiredVersion options:NSNumericSearch] != NSOrderedAscending) && ![currSysVer isEqualToString:@"Unknown"]; return isOSSupported; }


UTILIZAR :

if(isOSSupported("8.0") { // Code for iOS8 and above } else { // Code for iOS7 and below }


O use la constante del sistema NSFoundationVersionNumber_iOS_7_1 como se muestra a continuación

if(floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1) { // Code for iOS8 and above } else { // Code for iOS7 and below }


para más opciones Link


Solución para comprobar la versión de iOS en Swift.

switch (UIDevice.currentDevice().systemVersion.compare("8.0.0", options: NSStringCompareOptions.NumericSearch)) { case .OrderedAscending: println("iOS < 8.0") case .OrderedSame, .OrderedDescending: println("iOS >= 8.0") }

Con esta solución: es simplemente una mala práctica verificar los números de versión del SO, sea cual sea la forma en que lo haga. De esta manera, nunca se deben dependencias de código rígido, siempre se deben verificar las características, capacidades o la existencia de una clase. Considera esto; Apple puede lanzar una versión compatible con versiones anteriores de una clase, si lo hicieran, entonces el código que sugieres nunca lo usaría, ya que tu lógica busca un número de versión del sistema operativo y NO la existencia de la clase.

( Fuente de esta información )

Solución para comprobar la existencia de la clase en Swift.

if (objc_getClass("UIAlertController") == nil) { // iOS 7 } else { // iOS 8+ }

No lo use if (NSClassFromString("UIAlertController") == nil) porque funciona correctamente en el simulador de iOS con iOS 7.1 y 8.2, pero si realiza la prueba en un dispositivo real con iOS 7.1, lamentablemente notará que nunca pasará a través de la otra parte del fragmento de código.


// Above ios 8.0 float os_version = [[[UIDevice currentDevice] systemVersion] floatValue]; if (os_version >= 8.000000) {    //Use UIAlertController } else { //UIAlertView }