Pregunta UIAlertController si iOS 8, de lo contrario UIAlertView


Quiero cumplir con el UIAlertController utilizado en iOS 8 ya que UIAlertView ahora está en desuso. ¿Hay alguna manera de que pueda usar esto sin romper la compatibilidad con iOS 7? ¿Hay algún tipo de condición que pueda hacer para verificar iOS 8 o hacer otra cosa para el soporte de iOS 7?


27
2018-06-17 17:59


origen


Respuestas:


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

-

Puede verificar la versión de iOS para usar el control apropiado de esta manera:

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

4
2018-06-30 08:51



Creo que una manera mucho mejor de verificar 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

}

99
2017-09-04 02:36



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


12
2018-01-19 14:02



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 un Nombre de Clase, o nulo si no hay una clase con ese nombre actualmente cargada. Si aClassName es nil, devuelve nil.

Disponibilidad iOS (2.0 y posterior)


3
2017-10-23 11:45



Solución para verificar 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 con los números de versión del sistema operativo, de cualquier forma que lo haga. Nunca se deben codificar las dependencias de los códigos de esta forma, 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, el código que sugiere nunca lo usaría, ya que su 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 verificar la existencia de la clase en Swift

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

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


2
2018-03-18 11:37



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

1
2017-07-24 14:21



Crear simple utility function 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 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 Enlazar


1
2017-08-26 08:50



He creado un contenedor muy simple en Objective-C, que admite ambos: el antiguo UIAlertView de iOS y el nuevo UIAlertViewController

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

También trae el nuevo uso de bloques de acción a viejos 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];

1
2017-12-15 10:22



He escrito una clase que envuelve 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. Enlazar: https://github.com/kennymuse/UIAlertView


1
2017-10-29 09:57



Método uno

por la verificación de 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 la función del sistema detectar

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

Pero, hay una tercera lib nombrada PSTAlertControllerque se trata de compatible con versiones anteriores de iOS 7 de UIActionSheet y UIAlertView.

ref a


0
2017-12-05 07:55