我最近将我的应用更新为Swift 2,并且出现了一个错误,感谢你们,我解决了这个错误。 而现在,当我按下一个按钮播放声音时,我有第二个错误,即在运行时。这是信号SIGABRT错误。
以下是我在调试控制台中收到的错误消息:
2016-01-25 09:16:09.019 WarningShot1.0.0[291:19030] -[WarningShot1_0_0.ViewController playMySound:]: unrecognized selector sent to instance 0x135547d30
2016-01-25 09:16:09.021 WarningShot1.0.0[291:19030] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[WarningShot1_0_0.ViewController playMySound:]: unrecognized selector sent to instance 0x135547d30'
*** First throw call stack:
(0x182835900 0x181ea3f80 0x18283c61c 0x1828395b8 0x18273d68c 0x18755fe50 0x18755fdcc 0x187547a88 0x18755f6e4 0x18755f314 0x187557e30 0x1875284cc 0x187526794 0x1827ecefc 0x1827ec990 0x1827ea690 0x182719680 0x183c28088 0x187590d90 0x10005e2e0 0x1822ba8b8)
libc++abi.dylib: terminating with uncaught exception of type NSException
此外,这是它抛出此错误的代码的一部分,在第二行中,声明了类:
import UIKit
@UIApplicationMain
-> class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
这里发生了什么?我错过了什么/错误的?我需要在代码中进行哪些更改才能再次运行。这个应用程序非常简单,并且在最后一个版本的Swift下工作了几个月。为什么现在给我错误?
感谢您的帮助。
以下是我的ViewController.swift文件的代码:
import UIKit
导入AVFoundation 导入CoreMotion
类ViewController:UIViewController {
var myPlayer = AVAudioPlayer()
var mySound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("RemSound_01", ofType: "wav")!)
func initYourSound() {
do {
try myPlayer = AVAudioPlayer(contentsOfURL: mySound, fileTypeHint: nil)
myPlayer.prepareToPlay()
// myPlayer.volume = 1.0 // < for setting initial volume, still not perfected.
} catch {
// handle error
}
var motionManager = CMMotionManager()
var currentMaxAccelY : Double = 0.0
func viewDidLoad() {
super.viewDidLoad()
initYourSound()
// Do any additional setup after loading the view, typically from a nib.
//set motion manager properties
motionManager.accelerometerUpdateInterval = 0.17
//start recording data
// motionManager.startAccelerometerUpdatesToQueue(NSOperationQueue.currentQueue(), withHandler: {
// (accelerometerData: CMAccelerometerData!,error:NSError!) -> Void in
// self.outputAccelerationData(accelerometerData.acceleration)
// if(error != nil) {
// print("\(error)")
// }
// })
motionManager.startAccelerometerUpdatesToQueue(NSOperationQueue.currentQueue()!, withHandler: {
(accelerometerData,error) in outputAccelerationData(accelerometerData!.acceleration)
if(error != nil) {
print("\(error)", terminator: "")
}
})
}
//func outputAccelerationData(acceleration : CMAcceleration){
// accY?.text = "\(acceleration.y).2fg"
//if fabs(acceleration.y) > fabs(currentMaxAccelY)
//{
// currentMaxAccelY = acceleration.y
//}
// maxAccY?.text = "\(currentMaxAccelY) .2f"
//}
func outputAccelerationData(acceleration : CMAcceleration){
if fabs(acceleration.y) >= 1.25 {
myPlayer.play()
}
}
func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func playMySound(sender: AnyObject) {
myPlayer.play()
}
// self.resetMaxValues()
// @IBOutlet var accY: UILabel!
// @IBOutlet var maxAccY: UILabel!
// @IBAction func resetMaxValues() {
// currentMaxAccelY = 0
// }
} }
答案 0 :(得分:0)
“无法识别的选择器发送到实例”意味着“addTarget()”中的action-name与您要调用的函数的名称不匹配。可能是功能参数的东西..没有看到任何代码很难说。
action: Selector("playMySound:")
期望找到一个函数:
func playMySound(sender: AnyObject?) {};
答案 1 :(得分:0)
为了更轻松地跟踪发生的情况,您可以为所有异常添加符号断点。你可以在“异常”选项卡(窗口左侧)的Xcode中执行此操作,并且当抛出异常时,Xcode会像往常一样停止,您可能会查找堆栈跟踪。如果呼叫是同步的,你应该很容易找到并看到你的错误。
编辑:哦,你似乎已经使用XIB文件完成了用户界面。错误可能是,您将XIB文件中的按钮操作连接到视图控制器。如果您以后更改方法的签名(参数,名称等),UIKit无法找到该方法。打开XIB并修复错误。 ; - )