2014-06-05 22 views
11

Sto ricevendo dyld: Simbolo non trovato: _OBJC_CLASS _ $ _ UIAlertAction quando sto cercando di far funzionare questa mostruosità.Avviso che può funzionare su iOS 7 e iOS 8

Come faccio a fare un weaklink 8.0?

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", preferredStyle: 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; 

Risolto: UIKit ha dovuto essere contrassegnato Opzionale anziché Richiesto. Versione semplificata è ora:

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", preferredStyle: UIAlertControllerStyle.Alert) 
    alert.addAction(UIAlertAction(title: "Click", style:.Default, handler: nil)) 
    self.presentViewController(alert, animated: true, completion: nil) 
} 
+0

possibile duplicato di [Error mostrando un'UIAlertView in rapida] (http://stackoverflow.com/questions/24040519/error-showing-a-uialertview-in-swift) – Daniel

+1

Questo è un superset del problema ti sei riferito. Qualcun altro ha suggerito let avviso = UIAlertView() alert.title = "Noop" alert.message = "Niente da verificare" alert.addButtonWithTitle ("click") alert.show() che ha lavorato per me. qualcuno dovrebbe sicuramente trovare un bug con la convenienza inti rotto sullo shim UIAlertView –

+0

Si prega di dare un'occhiata alla risposta che ho pubblicato qui: [http://stackoverflow.com/a/24091779/1485344][1] [1]: http://stackoverflow.com/a/24091779/1485344 –

risposta

5
  • esplicitamente aggiungere UIKit nella sezione "collegamento binari con le librerie" di fasi di creazione del vostro progetto.

  • È possibile verificare l'esistenza di UIAlertController come questo:

    if NSClassFromString("UIAlertController") != nil { 
        // Use it 
    } else { 
        // Fall back 
    } 
    
  • ho scritto un wrapper che funziona sia su iOS 7 e iOS 8. È possibile find it here. Ci vuole un controller di vista seguita da una serie di argomenti opzionali e qualsiasi numero di pulsanti:

    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) 
    ) 
    
+0

non l'ho provato ma questo è quello che sto pensando di fare, un involucro.comunque, la differenza tra il mio piano e il tuo è che creerò un wrapper in un linguaggio veloce ma lo userò in object-c. –

+0

Questo sembra fantastico. Tuttavia, mentre funziona perfettamente su iOS8, su iOS7 visualizza la segnalazione come voluta ma non chiama i gestori di completamento per i due pulsanti. Cosa posso fare di sbagliato? showAlert (tabBarController, style: .Alert, titolo: "Login richiesto", messaggio: "È necessario effettuare il login prima di utilizzare questa funzione.", SourceView: nil, completamento: nil, \t (.Cancel, "Annulla" , {println ("ko")}), \t (.Default, "login", { \t \t println ("ok") \t})) – devguy

+0

ho provato copiare/incollare il vostro esempio, e anche che doesn lavoro per me su iOS7 – devguy

3

In Xcode 6 beta 5, non c'è nulla in Fasi di collegamento -> Collegamento binari con le librerie dal Swift collegamenti quadri implicitamente. In questo caso è necessario aggiungerlo manualmente e contrassegnarlo come facoltativo.

Inoltre, invece di verificare la versione del sistema in modo esplicito si può semplicemente verificare la disponibilità UIAlertController

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

Prova sotto il codice per l'obiettivo C. Funziona bene sia per iOS 8 e sotto di versione.

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