2016-08-09 44 views
1

Wenn ich versuche, mich anzumelden, erhalte ich die richtige Antwort. Aber nach dem Erfolg. Ich bekomme Absturz als optionalen Wert.Der optionale Wert stürzt beim Anmelden ab

Hier ist mein vollständiger Code:

var post:NSString = "name=\(Username)&email=\(Email)&phone=\(phonenumb)&password=\(Password)&address=\(address)" 

    NSLog("PostData: %@",post); 

    var url:NSURL = NSURL(string: "http://userregistration.php")! 
    // let url:NSURL = NSURL(string: "http://userregistration.php")! 

    let postData:NSData = post.dataUsingEncoding(NSASCIIStringEncoding)! 

    let postLength:NSString = String(postData.length) 

    let request:NSMutableURLRequest = NSMutableURLRequest(URL: url) 
    request.HTTPMethod = "POST" 
    request.HTTPBody = postData 
    request.setValue(postLength as String, forHTTPHeaderField: "Content-Length") 
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") 
    request.setValue("application/json", forHTTPHeaderField: "Accept") 


    let reponseError: NSError? 
    var response: NSURLResponse? 

    do { 
     let urlData = try? NSURLConnection.sendSynchronousRequest(request, returningResponse: &response) 

     if (urlData != nil) { 
      let res = response as! NSHTTPURLResponse!; 

      NSLog("Response code: %ld", res.statusCode); 

      if (res.statusCode >= 200 && res.statusCode < 300) 
      { 
       let responseData:NSString = NSString(data:urlData!, encoding:NSUTF8StringEncoding)! 

       NSLog("Response ==> %@", responseData); 


       do { 
        let jsonData = try NSJSONSerialization.JSONObjectWithData(urlData!, options: []) as! NSDictionary 

        let success:NSInteger = jsonData.valueForKey("success") as! NSInteger 

        //[jsonData[@"success"] integerValue]; 

        NSLog("Success: %ld", success); 

        if(success == 1) 
        { 
         NSLog("Sign Up SUCCESS"); 
         //self.dismissViewControllerAnimated(true, completion: nil) 
        } else { 
         var error_msg:NSString 

         if jsonData["error_message"] as? NSString != nil { 
          error_msg = jsonData["error_message"] as! NSString 
         } else { 
          error_msg = "Unknown Error" 
         } 
         let alertView:UIAlertView = UIAlertView() 
         alertView.title = "Sign Up Failed!" 
         alertView.message = error_msg as String 
         alertView.delegate = self 
         alertView.addButtonWithTitle("OK") 
         alertView.show() 

        } 

       } catch let error as NSError { 
        print("json error: \(error.localizedDescription)") 
       } 



      } else { 
       let alertView:UIAlertView = UIAlertView() 
       alertView.title = "Sign Up Failed!" 
       alertView.message = "Connection Failed" 
       alertView.delegate = self 
       alertView.addButtonWithTitle("OK") 
       alertView.show() 
      } 
     } 

    } 
} 

und ich bin in dieser Linie immer Absturz:

let success:NSInteger = jsonData.valueForKey("success") as! NSInteger 

Der Fehler ist crash.I Optionswert nicht wissen, wie diese error.Does zu handhaben jeder Experte bitte geben Sie mir eine Idee oder eine Lösung, um diesen Absturz zu beheben

+0

Weil 'jsonData.valueForKey ("Erfolg")' nill ist. Überprüfe deine Antwort. –

+0

Das bedeutet.Was soll ich brauchen, um – mack

+0

'Antwort ==> {" Status ": 1," Nachricht ":" Registrierung erfolgreich. "," CustomerId ": 2} 2016-08-09 12: 39: 02.228 M-Commerce [1454: 71029] Fehler ist nächste Zeile: 140725375544912 Schwerwiegender Fehler: unerwartet gefunden, Null beim Entpacken ein Optionaler Wert ' – mack

Antwort

0

Verwenden Sie immer sicher auspacken, und nicht direkt versuchen, auszupacken/Werte werfen, die Null sein kann.

korrekte Art und Weise ist-

if let successVal = jsonData["success"] as? NSInteger { 
    //Do something with successVal. 
} 

Obwohl nicht direkt mit Ihrem Problem zu tun hat, wollten Sie Ihre mit veralteter NSURLConnection API verweisen, statt NSURLSession basiert APIs für die Vernetzung verwendet werden.

dank

0

bei der Antwort suchen Sie nicht erhalten jede success wird aber nur status sind Sie sicher, dass Sie nicht für diesen Wert zu überprüfen?

Auch ich schlage vor, Sie Ihren Code so etwas wie zu bewegen:

guard let success = jsonData.valueForKey("success") as? Int else { 
asset('Check your response, is missing success key') 
return 
}