Xcode - 按下按钮时终止并出现 NSException 类型的未捕获异常

Xcode - Terminating with uncaught exception of type NSException when a button is pressed

我是应用程序开发的新手,我正在关注 Apple 的 tutorial 学习。我已经查看了很多关于此类错误的问题,但其中 none 对我有帮助。在本教程中,我停留在 "Add Buttons to the View" 部分,我试图实现一个字符串,当按钮处于 tapped/clicked 状态时在控制台上打印出来。只有我这样做时出错。

我在 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!")

    }

}

错误:

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) 

我知道 Xcode 保留了我已删除的对 action/outlets 的旧引用,因此我尝试右键单击 Interface Builder 中的 View Controller 以查找旁边带有感叹号的项目他们,但我找不到任何东西(到目前为止我只知道故障排除方法)。我正在使用 Xcode beta 7.0。感谢您的帮助!

您在选择器中遗漏了 ":",请尝试以下操作:

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

希望对你有所帮助。

我遇到了同样的问题, 检查 Xcode 的版本。

#selector自带Xcode 7.3

如果您有旧版本更新,这可能会修复您的错误。

此致, 德里斯

如果您使用的是 Swift 3,则必须将相关行更改为:

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

作为参考,我决定查看样本并遇到类似问题。

我正在使用 XCode 8 + Swift 3,这些是我为使其正常工作所做的更改:

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

注:考虑文件名"RatingControl.swift".

希望对你有所帮助=D