Alerta que puede funcionar en iOS 7 y iOS 8

Estoy recibiendo dyld: Símbolo no encontrado: _OBJC_CLASS _ $ _ UIAlertAction cuando estoy tratando de hacer funcionar esta monstruosidad.

¿Cómo puedo debilitar 8.0 cosas?

var device : UIDevice = UIDevice.currentDevice()!; var systemVersion = device.systemVersion; var iosVerion : Float = systemVersion.bridgeToObjectiveC().floatValue; if(iosVerion < 8.0) { let alert = UIAlertView() alert.title = "Noop" alert.message = "Nothing to verify" alert.addButtonWithTitle("Click") alert.show() } else { var alert : UIAlertController? = UIAlertController(title: "Noop", message: "Nothing to verify", prefernetworkingStyle: UIAlertControllerStyle.Alert) if alert { let actionStyle : UIAlertActionStyle? = UIAlertActionStyle.Default; var alertAction : UIAlertAction? = UIAlertAction(title: "Click", style: actionStyle!, handler: nil) if(alertAction) { alert!.addAction(alertAction) self.presentViewController(alert, animated: true, completion: nil) } } } return; 

Resuelto: UIKit debe marcarse como opcional en lugar de obligatorio. La versión simplificada ahora es:

 var device : UIDevice = UIDevice.currentDevice()!; var systemVersion = device.systemVersion; var iosVerion : Float = systemVersion.bridgeToObjectiveC().floatValue; if(iosVerion < 8.0) { let alert = UIAlertView() alert.title = "Noop" alert.message = "Nothing to verify" alert.addButtonWithTitle("Click") alert.show() } else { var alert : UIAlertController = UIAlertController(title: "Noop", message: "Nothing to verify", prefernetworkingStyle: UIAlertControllerStyle.Alert) alert.addAction(UIAlertAction(title: "Click", style:.Default, handler: nil)) self.presentViewController(alert, animated: true, completion: nil) } 

  • Agregue explícitamente UIKit en la sección "Enlace binary con bibliotecas" de las fases de construcción de su proyecto.

  • Puedes probar la existencia de UIAlertController así:

     if NSClassFromString("UIAlertController") != nil { // Use it } else { // Fall back } 
  • Escribí un contenedor que funciona tanto en iOS 7 como en iOS 8. Puedes encontrarlo aquí . Se necesita un controller de vista seguido de un grupo de arguments opcionales y cualquier número de botones:

     showAlert(self, style: .ActionSheet, sourceView: cell, completion: { tableView.deselectRowAtIndexPath(indexPath, animated: true) }, (.Default, "Send clipboard", { if someCondition { // completion must be specified because of a Swift bug (rdar://18041904) showAlert(self, title: "Nothing to send", message: "The clipboard is empty.", completion: nil, (.Cancel, "OK", nil) ) } }), (.Cancel, "Cancel", nil) ) 

En Xcode 6 beta 5, no hay nada en las Fases del enlace -> Enlace binary con bibliotecas ya que Swift vincula frameworks de manera implícita. En este caso, debe agregarlo manualmente y marcar opcionalmente.

Además, en lugar de verificar explícitamente la versión del sistema, puede verificar la disponibilidad de UIAlertController.

 if nil != NSClassFromString("UIAlertController") { //show alertcontroller ... } else { //show alertview ... } 

Pruebe el código a continuación para el Objetivo C. Funciona bien para iOS 8 y versiones posteriores.

 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]; }