Завершение с необработанным исключением типа NSException Timer Swift Crash - PullRequest
0 голосов
/ 14 июня 2019

Я пытаюсь использовать класс таймера в swift, но мое приложение продолжает сбой с сигналом SIGBART, а также завершает работу с необработанным исключением ошибок типа NSException.Пожалуйста помоги.Спасибо.

Я сузил его из-за своего таймера, но не знаю, как это исправить.

import UIKit
import AVFoundation



class playSound
{
    var audioPlayer:AVAudioPlayer?
    var bpm: Int
    var switchOn: Bool

    init(switchOn: Bool, bpm: Int)
    {
        self.bpm = bpm
        self.switchOn = switchOn

    }

    func startSound()
    {
        self.switchOn = true
    }

    func changeBpm(bpm:Int)
    {
        self.bpm = bpm
    }

    func stopSound()
    {
        self.audioPlayer?.pause()
        self.switchOn = false
    }

    @objc func repeatSound()
    {
        DispatchQueue.global(qos: .background).async
        {
            while (true)
            {
                let sleepAmount:Float = Float(abs((60/self.bpm)-1))
                //print(self.bpm)
                //print(sleepAmount)
                if (self.switchOn == true)
                {

                        print("hello")
                        let url = Bundle.main.url(forResource: "click", withExtension: "mp3")
                        guard url !=  nil else
                        {
                            return
                        }

                        do
                        {
                            self.audioPlayer = try AVAudioPlayer(contentsOf: url!)
                            self.audioPlayer?.play()
                            print(self.bpm)
                        }
                        catch
                        {
                            print("error")
                        }

                }
            }

        }
    }
}

class ViewController: UIViewController
{
var timer = Timer()
@IBOutlet weak var lbl: UILabel!

@IBOutlet weak var stepperView: UIStepper!
@IBOutlet weak var sliderView: UISlider!
var clickClass = playSound(switchOn: false, bpm: 120)

override func viewDidAppear(_ animated: Bool)
{
    clickClass.repeatSound()
}

@IBAction func `switch`(_ sender: UISwitch)
{
    do
    {
        if sender.isOn == true
        {
        // this is the code causing the error
            timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(clickClass.repeatSound), userInfo: nil, repeats: true)
            print("play")


        }
        else
        {
            timer.invalidate()
            clickClass.stopSound()
            print("pause")
        }
    }
}

}

Я ожидаю, что приложение будет воспроизводить звук каждую секунду.Ошибка:

2019-06-13 22:49:38.226089-0700 Metronome[6695:2566182] -[Metronome.ViewController repeatSound]: unrecognized selector sent to instance 0x145e11dc0
2019-06-13 22:49:38.229502-0700 Metronome[6695:2566182] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Metronome.ViewController repeatSound]: unrecognized selector sent to instance 0x145e11dc0'
*** First throw call stack:
(0x18144127c 0x18061b9f8 0x18135dab8 0x1adc27f60 0x181446ac4 0x18144875c 0x181ec88a4 0x1813d3650 0x1813d3380 0x1813d2bb4 0x1813cdb04 0x1813cd0b0 0x1835cd79c 0x1adbfc978 0x100ffccf0 0x180e928e0)
libc++abi.dylib: terminating with uncaught exception of type NSException

вместе с Thread 1: signal SIGABRT

Ответы [ 2 ]

0 голосов
/ 14 июня 2019

Указана неверная цель в вашем коде для таймера.Измените цель на self.clickClass, как показано ниже:

timer = Timer.scheduledTimer(timeInterval: 1, target: self.clickClass, selector: #selector(clickClass.repeatSound), userInfo: nil, repeats: true)

С целью self приложение пытается найти метод repeatSound в том же контроллере представления.Также, пожалуйста, перейдите по ссылке ниже, чтобы ознакомиться с рекомендациями для быстрых соглашений об именах:

https://github.com/raywenderlich/swift-style-guide

0 голосов
/ 14 июня 2019

Вы передаете не ту цель таймеру.Вы хотите передать clickClass, а не self.И селектор не должен ссылаться на переменную, он должен ссылаться на класс.

timer = Timer.scheduledTimer(timeInterval: 1, target: clickClass, selector: #selector(playSound.repeatSound), userInfo: nil, repeats: true)

Вы также должны позаботиться о правильном названии вещей.Имена классов, структур и перечислений должны начинаться с заглавных букв.Имена переменных, функций и регистра должны начинаться со строчных букв.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...