【问题标题】:try - throws in IBAction - xCode 7尝试 - 抛出 IBAction - xCode 7
【发布时间】:2015-08-30 16:39:28
【问题描述】:

我对新的“throws”-“try”参数有疑问。

添加这些单词时出现错误,因此我在 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 异常预处理 + 165 1 libobjc.A.dylib 0x000000010cd0edf1 objc_exception_throw + 48 2核心基础0x000000010d684b5d-[NSObject(NSObject)不识别选择器:]+205 3 核心基础 0x000000010d5d1e3a ___forwarding_ + 970 4 核心基础 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 发送事件:] + 865 12 UIKit 0x000000010dc62705-[UIApplication sendEvent:] + 263 13 UIKit 0x000000010dc3f5df _UIApplicationHandleEventQueue + 6031 14 核心基础 0x000000010d5a70f1 CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION + 17 15 核心基础 0x000000010d59ceac __CFRunLoopDoSources0 + 556 16 核心基础 0x000000010d59c363 __CFRunLoopRun + 867 17 核心基础 0x000000010d59bd78 CFRunLoopRunSpecific + 488 18 图形服务 0x0000000111fdebca 图形服务 + 52170 19 UIKit 0x000000010dc4479b UIApplicationMain + 171 20 BottLED 0x000000010c7cb9ad 主 + 109 21 libdyld.dylib 0x000000011029ca05 libdyld.dylib + 10757 22 ??? 0x0000000000000001 0x0 + 1 ) libc++abi.dylib:以 NSException 类型的未捕获异常终止 (lldb)

当我做一些断点并删除“抛出”时,应用程序不会崩溃。我现在真的不知道该怎么办..希望有人能帮助我!

完整代码为:

@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)
                    {

【问题讨论】:

  • 你的完整代码是什么?您需要将 try 包装在 do-catch 块中。你在做这个吗?
  • 不,我没有。我会在一分钟内发布整个代码

标签: ios swift2 xcode7


【解决方案1】:

没有什么可以捕捉到错误。您需要将 throws 方法从按钮 IBAction 中取出。

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

【讨论】:

    【解决方案2】:

    在 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
    }
    

    【讨论】:

    • 我该怎么做?可以举个例子吗?
    • @LukePistrol 添加了一个如何捕获所有错误的示例。
    • 好的。以及如何在 let jsonData:NSDictionary = try NSJSONSerialization.JSONObjectWithData(urlData!, options:NSJSONReadingOptions.MutableContainers ) 上使用它! NSDictionary
    • @LukePistrol 以同样的方式,只是始终将 } catch { ... } 添加为最后一个错误处理程序。如果你愿意,你可以在那里放置一个断言。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 2014-04-06
    相关资源
    最近更新 更多