UIAlertController si iOS 8, de lo contrario UIAlertView

Quiero cumplir con el UIAlertController usado en iOS 8 ya que UIAlertView ahora está en desuso. ¿Hay alguna manera de que pueda usar esto sin romper el soporte para iOS 7? ¿Hay algún tipo de condición si puedo hacer para verificar iOS 8 de lo contrario hacer algo más para el soporte de iOS 7?

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

Puede verificar la versión de iOS para usar un control apropiado como este:

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

Creo que una mejor manera de verificar si existe una class (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 } 

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 lo use if NSClassFromString("UIAlertController") == nil No funciona porque la firma para este método es func NSClassFromString(_ aClassName: String!) -> AnyClass!

Como ya lo han mencionado otros, 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 class con un error tipográfico. 🙂

De la documentation de NClassFromString :

[Devuelve] El object de class nombrado por aClassName, o nil si no hay ninguna class por ese nombre cargada actualmente. Si aClassName es nil, devuelve nil.

Disponibilidad iOS (2.0 y posterior)

Solución para verificar la versión de iOS en Swift

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

Con esta solución: es simplemente una mala práctica verificar en contra de los numbers de versión del sistema operativo, independientemente de cómo lo hagas. Uno nunca debería tener dependencies de código rígido de esta manera, siempre verifique las características, capacidades o la existencia de una class. Considera esto; Apple puede lanzar una versión compatible con versiones anteriores de una class, si lo hiciera, entonces el código que sugiere no lo usaría nunca, ya que su lógica busca un número de versión del sistema operativo y NO la existencia de la class.

( Fuente de esta información )

Solución para verificar la existencia de la class en Swift

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

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

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

Cree una utility function simple para networkingucir el código.

CÓDIGO:

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

UTILIZAR :

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


O utilice la constante del sistema NSFoundationVersionNumber_iOS_7_1 como se NSFoundationVersionNumber_iOS_7_1 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

He creado un envoltorio muy simple en Objective-C, que es compatible tanto con el iOS UIAlertView anterior como con el nuevo UIAlertViewController

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

También trae el nuevo uso de bloques de acción a UIAlertView anterior 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 class que envuelve el UIAlertView y usa UIAlertController. Para el progtwigdor es transparente, por lo tanto, es suficiente importar estas classs en el proyecto. La utilidad de estas classs es cuando en un proyecto antiguo hay más UIAlertView para cambiar. Enlace: https://github.com/kennymuse/UIAlertView

Método uno

Comprobación de la versión del sistema ios

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

Método dos

por function de detección del sistema

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

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

ref a

  • Compatibilidad con varias versiones de iOS
  • Compatible con iOS 6
  • Compatibilidad con múltiples versiones y dispositivos de iOS

Prueba debajo del código. Funciona bien para iOS 8 y la versión inferior.

 if (IS_OS_8_OR_LATER) { UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:title message:msg prefernetworkingStyle:UIAlertControllerStyleAlert]; UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) { }]; [alertVC addAction:cancelAction]; [[[[[UIApplication shanetworkingApplication] 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]; }