Изменить изображение звуковой кнопки при нажатии другой кнопки Swift 2.2 - PullRequest
3 голосов
/ 26 мая 2019

Я создаю Tableview, внутри которого находится Tableviewcell, а в ячейке есть метка и кнопка звука.Для каждого ярлыка есть звук при нажатии кнопки.Когда я нажимаю в первый раз на btn1, звучит звук, и изображение кнопки меняется на «пауза», когда я нажимаю снова, тот же звук кнопки останавливается, и изображение меняется на «воспроизведение», и это прекрасно работает, но когда я нажимаю для первоговремя на одной кнопке, допустим, btn1 и, не нажимая его снова (остановка звука), я нажимаю на btn2, звук btn1 останавливается, и изображение btn1 или btn2 изменяется.Я хочу, чтобы при нажатии на кнопки 2,3 или 4 предыдущий звук прекратился, изображение предыдущей кнопки (означает, что все кнопки, кроме текущей) должно измениться на «воспроизведение», а текущая нажатая кнопка должна измениться на «пауза»и звук предыдущего щелчка должен прекратиться, и текущий нажатый должен воспроизвести.

import UIKit

class TableViewCell: UITableViewCell {

    @IBOutlet weak var titleLable: UILabel!
    @IBOutlet weak var sound: UIButton!
    override func awakeFromNib() {
        super.awakeFromNib()
    }

class ViewController: UIViewController , UITableViewDataSource , UITableViewDelegate , GADInterstitialDelegate {

    var countsNumberOfButtonClicks = 0
    var countsNumberOfInfoBtnClicks = 0
    var isFirstTime = false
    var player : AVAudioPlayer! = nil
    var titleAlert: String!

    @IBOutlet weak var myTableView: UITableView!
    var toggleState = 1


 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell.

    {

    let myCell = self.myTableView.dequeueReusableCellWithIdentifier("myCell", forIndexPath: indexPath) as! TableViewCell

        myCell.titleLable.text = self.Duck[indexPath.row]

        myCell.sound.tag = indexPath.row
        myCell.sound.addTarget(self, action: #selector(self.playSound), forControlEvents: .TouchUpInside)
     return myCell
    }

   @IBAction func playSound(sender: UIButton) {

            if toggleState == 1 {
            let fullName: String = self.Duck[sender.tag]
            let fullNameArr = fullName.componentsSeparatedByString(" ")
            let path = NSBundle.mainBundle().pathForResource(fullNameArr[0], ofType:"wav", inDirectory: "sounds")
            let fileURL = NSURL(fileURLWithPath: path!)
            do {
                player = try AVAudioPlayer(contentsOfURL: fileURL)
                player.prepareToPlay()
            } catch {
                print("Problem in getting File")
              }   
            player.play()
            sender.setImage(UIImage(named: "pause.png"), forState: UIControlState.Normal)
            print("toggle state 1")
            toggleState = 2
        }
        else {
            player.pause()
            toggleState = 1
            sender.setImage(UIImage(named: "play.png"), forState: UIControlState.Normal)
            print("Toggle state else")
 }

Результат симулятора

1 Ответ

1 голос
/ 26 мая 2019

В вашем классе объявите переменную,

var currentlyPlaying : UIButton?

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

@IBAction func playSound(sender: UIButton) {

        if currentlyPlaying != sender || toggleState == 1 {

        //Set image in previous
        currentlyPlaying?.setImage(UIImage(named: "play.png")

        if player != nil{
            player.pause()
        }

        let fullName: String = self.Duck[sender.tag]
        let fullNameArr = fullName.componentsSeparatedByString(" ")
        let path = NSBundle.mainBundle().pathForResource(fullNameArr[0], ofType:"wav", inDirectory: "sounds")
        let fileURL = NSURL(fileURLWithPath: path!)
        do {
            player = try AVAudioPlayer(contentsOfURL: fileURL)
            player.prepareToPlay()
        } catch {
            print("Problem in getting File")
          }   
        player.play()


        sender.setImage(UIImage(named: "pause.png"), forState: UIControlState.Normal)

        //Store new
        currentlyPlaying = sender

        print("toggle state 1")

        if sender != currentlyPlaying{
            toggleState = 2
        }

        myTableView.reloadData()

    }
    else {
        player.pause()
        toggleState = 1
        sender.setImage(UIImage(named: "play.png"), forState: UIControlState.Normal)
        print("Toggle state else")
}
...