Ошибка SIGABRT в Swift 2

Недавно я обновил свое приложение до 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
// }

} }


person Nicholas De Gonzaga Sevilla    schedule 25.01.2016    source источник
comment
показать код, связанный с playMySound   -  person Teja Nandamuri    schedule 25.01.2016
comment
как создается кнопка?   -  person Teja Nandamuri    schedule 25.01.2016
comment
Ошибка говорит: В классе ViewController отсутствует метод playMySound:.   -  person vadian    schedule 25.01.2016
comment
Просто добавил код моего файла ViewController.swift.   -  person Nicholas De Gonzaga Sevilla    schedule 25.01.2016
comment
Еще один комментарий к моему приложению: я получаю одно сообщение об ошибке, в котором говорится, что все ориентации интерфейса должны поддерживаться, если приложению не требуется полноэкранный режим. Мое приложение требует портретной ориентации и полноэкранного режима. Это также новое сообщение об ошибке, так что мне делать, чтобы избавиться от него? Мне просто хочется выбросить весь код и начать с нуля. Но тогда я, вероятно, закончу с большим количеством ошибок.   -  person Nicholas De Gonzaga Sevilla    schedule 25.01.2016
comment
В конце initYourSound() отсутствует закрывающая скобка   -  person vadian    schedule 25.01.2016
comment
Это САМАЯ распространенная ошибка времени выполнения, и это настолько распространенный вопрос о переполнении стека, что я даже не удосужился выбрать дубликат. Пожалуйста, в будущем ищите, прежде чем спрашивать.   -  person matt    schedule 25.01.2016


Ответы (2)


«неопознанный селектор отправлен в экземпляр» означает, что существует несоответствие между именем действия в «addTarget()» и именем функции, которую вы хотите вызвать. Наверное что-то с параметрами функции. Трудно сказать не видя кода.

action: Selector("playMySound:")

ожидает найти функцию:

func playMySound(sender: AnyObject?) {};
person Michael    schedule 25.01.2016
comment
Просто добавил код моего файла ViewController.swift. - person Nicholas De Gonzaga Sevilla; 25.01.2016
comment
Функция есть, я добавил весь код Viewcontroller.swift в свой исходный вопрос. Спасибо - person Nicholas De Gonzaga Sevilla; 25.01.2016
comment
Где вы вызываете функцию?? Вы используете раскадровку? - person Michael; 26.01.2016
comment
Я вызывал его через @IBaction, но, по-видимому, преобразование в Swift 2 стерло эту команду перед функцией и больше НЕ разрешает ее. Это действительно дерьмовое обновление, что бы люди ни говорили, оно полностью сломало работающее приложение, LOL: IBAction func playMySound(sender: AnyObject) { myPlayer.play() - person Nicholas De Gonzaga Sevilla; 26.01.2016
comment
Я только что нашел это, где я должен поместить свою кнопку, которая должна быть реализована внутри класса. Я думаю, что на данный момент я просто собираюсь начать с нуля, это займет меньше времени, и я должен (смеется) создать это приложение с правильными подходами к Swift 2 и новыми улучшениями. Я посмотрел на изменения, и конверсия изменила 9 или более вещей, что означает как минимум 9 или более ошибок, которые я должен исправить. Это не прогресс. [ссылка] stackoverflow.com/questions/34477470/ - person Nicholas De Gonzaga Sevilla; 26.01.2016

Чтобы упростить отслеживание происходящего, вы можете добавить символическую точку останова для всех исключений. Вы делаете это в Xcode на вкладке «исключения» (левая часть окна), и когда возникает исключение, Xcode останавливается, как обычно, и вы можете посмотреть трассировку стека. Если вызов синхронный, вы должны легко найти и увидеть свою ошибку.

РЕДАКТИРОВАТЬ: Ну, вы, кажется, сделали пользовательский интерфейс, используя файл XIB. Ошибка может заключаться в том, что вы подключили действие кнопки в файле XIB к контроллеру представления. Если позже вы измените сигнатуру метода (параметр, имя и т. д.), UIKit не сможет найти метод. Откройте XIB и исправьте ошибку. ;-)

person Anticro    schedule 25.01.2016
comment
У меня есть только один файл XIB, экран запуска. Он ни с чем не взаимодействует. Пользовательский интерфейс — это только один ViewController. И в нем всего два взаимодействия: кнопка, которая вызывает ошибку при нажатии SIGABRT, и датчик движения, который даже не работает, так как кнопка вылетает из приложения. - person Nicholas De Gonzaga Sevilla; 26.01.2016