尝试 - 抛出IBAction - xCode 7

时间:2015-06-15 08:45:56

标签: ios swift2 xcode7

我遇到了新问题"抛出" - "尝试"参数。

我收到错误添加这些单词,所以我添加了" throws"在IBAction函数结束时。

@IBAction func loginButtonPressed(sender: AnyObject)throws {//code here}

在里面我找了一些不相干的东西然后这个:

let jsonData:NSDictionary = try NSJSONSerialization.JSONObjectWithData(urlData!, options:NSJSONReadingOptions.MutableContainers ) as! NSDictionary

之后没有错误,但是当我运行应用程序并单击按钮时,应用程序崩溃了代码

  

2015-06-15 10:43:11.374 BottLED [7283:1175818] - [BottLED.loginViewController loginButtonPressed:]:无法识别的选择器发送到实例0x7fee28da7d20   2015-06-15 10:43:11.381 BottLED [7283:1175818] *由于未捕获的异常终止应用程序' NSInvalidArgumentException',原因:' - [BottLED.loginViewController loginButtonPressed:]:无法识别的选择器发送到实例0x7fee28da7d20'   * 第一次抛出调用堆栈:   (       0 CoreFoundation 0x000000010d67c885 exceptionPreprocess + 165       1 libobjc.A.dylib 0x000000010cd0edf1 objc_exception_throw + 48       2 CoreFoundation 0x000000010d684b5d - [NSObject(NSObject)doesNotRecognizeSelector:] + 205       3 CoreFoundation 0x000000010d5d1e3a ___转发_ + 970       4 CoreFoundation 0x000000010d5d19e8 _CF_forwarding_prep_0 + 120       5 UIKit 0x000000010dc46257 - [UIApplication sendAction:to:from:forEvent:] + 125       6 UIKit 0x000000010dc461b2 - [UIApplication sendAction:toTarget:fromSender:forEvent:] + 79       7 UIKit 0x000000010dda1422 - [UIControl sendAction:to:forEvent:] + 67       8 UIKit 0x000000010dda16c6 - [UIControl _sendActionsForEvents:withEvent:] + 272       9 UIKit 0x000000010dda08a9 - [UIControl touchesEnded:withEvent:] + 599       10 UIKit 0x000000010dcacbe8 - [UIWindow _sendTouchesForEvent:] + 835       11 UIKit 0x000000010dcad7d6 - [UIWindow sendEvent:] + 865       12 UIKit 0x000000010dc62705 - [UIApplication sendEvent:] + 263       13 UIKit 0x000000010dc3f5df _UIApplicationHandleEventQueue + 6031       14 CoreFoundation 0x000000010d5a70f1 CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION + 17       15 CoreFoundation 0x000000010d59ceac __CFRunLoopDoSources0 + 556       16 CoreFoundation 0x000000010d59c363 __CFRunLoopRun + 867       17 CoreFoundation 0x000000010d59bd78 CFRunLoopRunSpecific + 488       18 GraphicsServices 0x0000000111fdebca GraphicsServices + 52170       19 UIKit 0x000000010dc4479b UIApplicationMain + 171       20 BottLED 0x000000010c7cb9ad main + 109       21 libdyld.dylib 0x000000011029ca05 libdyld.dylib + 10757       22 ??? 0x0000000000000001 0x0 + 1   )   libc ++ abi.dylib:以NSException类型的未捕获异常终止   (LLDB)

当我执行一些断点并删除" throws"时,应用程序不会崩溃。我真的不知道该怎么做..我希望有人可以帮助我!

完整的代码是:

@IBAction func loginButtonPressed(sender: AnyObject)throws {
    var name:NSString = textFieldName.text!
    let pass:NSString = textFieldPw.text!
    if ( name.isEqualToString("") || pass.isEqualToString("") ) {
        let loginFailed = UIAlertView(title: "Failed to Signup",
            message: "Please fill in all Textfields",
            delegate: nil,
            cancelButtonTitle: "OK")
        loginFailed.show()
    } else {

            let post:NSString = "username=\(name)&password=\(pass)"

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

            let url:NSURL = NSURL(string: "my url")!

            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")


            var reponseError: NSError?
            var response: NSURLResponse?

            var urlData: NSData?
            do {
                urlData = try NSURLConnection.sendSynchronousRequest(request, returningResponse:&response)
            } catch let error as NSError {
                reponseError = error
                urlData = nil
            }

            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);



                    let jsonData:NSDictionary = try NSJSONSerialization.JSONObjectWithData(urlData!, options:NSJSONReadingOptions.MutableContainers ) as! NSDictionary


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

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

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

                    if(success == 1)
                    {

2 个答案:

答案 0 :(得分:1)

在Obj-C中throws是Obj-C error: (NSError **)error参数的语法糖。

throws添加到方法时,它会秘密添加参数。您的方法将不再是loginButtonPressed:,它将是loginButtonPressed:error:(至少对于Obj-C)。但是,在处理事件时,系统仍将查找方法loginButtonPressed:,因为这是事件在XIB中的连接方式。该方法已不存在,因此该应用将与unrecognized selector sent to instance崩溃。

解决方案:不要在动作处理程序中使用throws,它违反了方法的约定,因为系统不会指望任何东西被抛出。捕获动作处理程序中的所有错误。

do {
    urlData = try NSURLConnection.sendSynchronousRequest(request, returningResponse:&response)
} catch let error as NSError {
    reponseError = error
    urlData = nil
} catch {
   // Catch all error-handling
    urlData = nil
}

答案 1 :(得分:0)

没有什么能抓住这个错误。你需要从按钮IBAction中取出你的投掷方法。

从IBAction中删除throws并创建一个新方法。然后尝试捕获方法中的错误。无论哪种方式,都不要抛弃IBAction。