2016-04-28 5 views
0

Verwenden der neuesten Version von XCode und Swift.IBOutlet scheint nicht aktiv zu sein, wenn die dedRegisterForRemoteNotificationsWithDeviceToken der App-Delegierten aufgerufen wird

Ich habe eine einfache Anwendung mit einem Webview erstellt. Das IBOutlet innerhalb der Steuerung ist korrekt verdrahtet. Beim Laden einer Anfrage in viewDidLoad() scheint alles in Ordnung zu sein.

Allerdings wollte ich den Geräte-Token an die Webansicht übergeben. Ich verwende die folgende Funktion innerhalb AppDelegate:

var vc = ViewController() 
... 
func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) { 
    var token = NSString(format: "%@", deviceToken) 
    token = token.stringByReplacingOccurrencesOfString("<", withString: "") 
    token = token.stringByReplacingOccurrencesOfString(">", withString: "") 
    token = token.stringByReplacingOccurrencesOfString(" ", withString: "") 
    vc.deviceToken = token as String; 
    vc.loadSomeUrl() 
} 

Die loadSomeUrl() Funktion wie folgt aussieht:

func loadSomeUrl() { 
    let url = NSURL (string: "http://google.de"); 
    let requestObj = NSURLRequest(URL: url!); 

    webview.loadRequest(requestObj); 

} 

Wenn die Anwendung ausgeführt wird, erhalte ich die folgende Meldung:

fatal error: unexpectedly found nil while unwrapping an Optional value

Ich habe buchstäblich keine Ahnung, was das Problem ist. Ich fand heraus, dass die Webansicht plötzlich null ist, obwohl viewDidLoad() zuvor aufgerufen wurde. Ich habe einen Ausdruck (webview) zu viewDidLoad() hinzugefügt, das richtig funktioniert. Beim Hinzufügen von print (webview) zu loadSomeUrl(); Der obige schwerwiegende Fehler wird ebenfalls ausgelöst.

Für weitere Untersuchungen habe ich das folgende Snippet zum Ausgang hinzugefügt.

@IBOutlet var webview: UIWebView!{ 
    didSet { 
     print("webview set to %@", webview); 
    } 
} 

Das Outut ist in Ordnung. Der obige Fehler tritt nach dieser Ausgabe auf.

webview set to %@ <UIWebView: 0x145d18910; frame = (0 0; 600 556); autoresize = RM+BM; layer = <CALayer: 0x145d20f20>> fatal error: unexpectedly found nil while unwrapping an Optional value

Hat jemand eine Ahnung hat, was das Problem ist? Vielleicht adressiere ich dieses ganze Problem auf die falsche Art.

+0

requestObj nicht gleich Null ist, nicht wahr? –

Antwort

1

Ich denke, dass in AppDelegate erstellen Sie eine neue Instanz Ihres VC, und dort ist das WebView Null.

var vc = ViewController() 

Also müssen Sie den ViewController im AppDelegate aus dem Storyboard laden.

Eine andere Möglichkeit besteht darin, eine Benachrichtigung an viewController zu senden, wenn Sie ein Token erhalten.

In obj-c es ist:

[[NSNotificationCenter defaultCenter] postNotificationName:@"tokenNotification" object:token userInfo:userInfo]; 

Swift:

//AppDElegate 

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) 
    { 
     var token = NSString(format: "%@", deviceToken) 
     token = token.stringByReplacingOccurrencesOfString("<", withString: "") 
     token = token.stringByReplacingOccurrencesOfString(">", withString: "") 
     token = token.stringByReplacingOccurrencesOfString(" ", withString: "") 

     NSNotificationCenter.defaultCenter().postNotificationName("tokenNotification", object: token); 

    } 

// VC 
override func viewDidLoad() { 
     super.viewDidLoad() 


     NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.loadSomeUrl), name: "tokenNotification", object: nil) 

    } 

func loadSomeUrl(notification:NSNotification) { 
     let url = NSURL (string: "http://google.de"); 
     let requestObj = NSURLRequest(URL: url!); 

     webview.loadRequest(requestObj); 

    } 
+0

Das ist genau der Code, den ich in meinem AppDelegate verwende. Wie kann ich über das Storyboard in Swift auf den Controller zugreifen? Danke vielmals! – bumblebee

+0

hat meine Antwort bearbeitet, bitte sehen Sie sich die Benachrichtigung an –

+0

Fantastisch - funktioniert wie ein Charme! Danke vielmals! – bumblebee

Verwandte Themen