-->

Xcode - Terminating with uncaught exception of typ

2020-04-11 10:59发布

问题:

I'm new to app development and I'm following Apple's tutorial to learn. I've looked through a lot of questions asked about this type of error but none of them are helping me. In the tutorial, I'm stuck on the "Add Buttons to the View" section where I'm trying to implement a string to be printed out on the console when a button is tapped/clicked on. Only I get an error when doing so.

My code for the button in Swift:

import UIKit

class StarRatingControl: UIView {

    // MARK: Initialization

    required init?(coder aDecoder: NSCoder) {

        super.init(coder: aDecoder)

        let button = UIButton(frame: CGRect(x: 0, y: 0, width: 44, height: 44))
        button.backgroundColor = UIColor.cyanColor()

        button.addTarget(self, action: "ratingButtonTapped", forControlEvents: .TouchDown)

        addSubview(button)

    }

    override func intrinsicContentSize() -> CGSize {

        return CGSize(width: 240, height: 44)

    }

    // MARK: Button Action

    func ratingButtonTapped(button: UIButton) {

        print("Button pressed!")

    }

}

The error:

2015-09-16 12:43:17.409 FoodTracker[954:13341] -[FoodTracker.StarRatingControl ratingButtonTapped]: unrecognized selector sent to instance 0x7f939b7a43b0
2015-09-16 12:43:17.443 FoodTracker[954:13341] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[FoodTracker.StarRatingControl ratingButtonTapped]: unrecognized selector sent to instance 0x7f939b7a43b0'
*** First throw call stack:
(
    0   CoreFoundation                      0x00000001079f59b5 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x00000001095f4deb objc_exception_throw + 48
    2   CoreFoundation                      0x00000001079fdfdd -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
    3   CoreFoundation                      0x000000010794b9fa ___forwarding___ + 970
    4   CoreFoundation                      0x000000010794b5a8 _CF_forwarding_prep_0 + 120
    5   UIKit                               0x0000000108214522 -[UIApplication sendAction:to:from:forEvent:] + 92
    6   UIKit                               0x0000000108373c06 -[UIControl sendAction:to:forEvent:] + 67
    7   UIKit                               0x0000000108373eac -[UIControl _sendActionsForEvents:withEvent:] + 273
    8   UIKit                               0x0000000108372b1c -[UIControl touchesBegan:withEvent:] + 261
    9   UIKit                               0x000000010827bf50 -[UIWindow _sendTouchesForEvent:] + 308
    10  UIKit                               0x000000010827cd4d -[UIWindow sendEvent:] + 865
    11  UIKit                               0x00000001082312ae -[UIApplication sendEvent:] + 263
    12  UIKit                               0x000000010820d36c _UIApplicationHandleEventQueue + 6693
    13  CoreFoundation                      0x0000000107921b21 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
    14  CoreFoundation                      0x0000000107917a4c __CFRunLoopDoSources0 + 556
    15  CoreFoundation                      0x0000000107916f03 __CFRunLoopRun + 867
    16  CoreFoundation                      0x0000000107916918 CFRunLoopRunSpecific + 488
    17  GraphicsServices                    0x000000010befead2 GSEventRunModal + 161
    18  UIKit                               0x000000010821299e UIApplicationMain + 171
    19  FoodTracker                         0x00000001078118dd main + 109
    20  libdyld.dylib                       0x000000010a11392d start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 

I understand that Xcode keeps old references to action/outlets that I've deleted so I tried right-clicking on the View Controller in the Interface Builder to find items with the exclamation point next to them but I couldn't find anything(only troubleshooting method I know of so far). I'm using Xcode beta 7.0. Any help is appreciated!

回答1:

You're missing the ":" in the selector, try the following instead:

button.addTarget(self, action: "ratingButtonTapped:", forControlEvents: .TouchDown)

I hope this help you.



回答2:

If you're using Swift 3, the line in question would have to be changed to:

button.addTarget(self, action: #selector(StarRatingControl.ratingButtonTapped), for: .touchDown)



回答3:

I had the same problem, Check the version of your Xcode.

#selector comes with Xcode 7.3

If you have an older version update and this will probably fix your errors.

Regards, Driss



回答4:

For reference, I've decided to have a look at the sample and got a similar issue.

I'm using XCode 8 + Swift 3 and these are my changes in order to get it working:

button.addTarget(self, action: #selector(RatingControl.ratingButtonTapped), for: .touchDown)

Note: considering the file name "RatingControl.swift".

I hope it help =D