Невозможно получить правильные аудиофайлы для воспроизведения из массива - PullRequest
0 голосов
/ 26 апреля 2018

Когда я нажимаю на любую из моих ячеек в моем табличном представлении, все они воспроизводят одну и ту же песню в первом массиве. Как мне заставить их играть песню, которая назначена их индивидуальному массиву? Функция FunP AutomaticPlay () отвечает за работу с аудио на этом виртуальном канале. При нажатии на ячейку песня должна воспроизводиться автоматически.

import UIKit
import Firebase
import FirebaseAuth
import FirebaseDatabase
import FirebaseStorage
import AVFoundation

class ListViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    @IBOutlet var tableViewProducts: UITableView!
    var delegate: ListViewController?

    var ref:DatabaseReference?
    var databaseHandle: DatabaseHandle?
    let audioStuffed = false
    let audioPlayer = AVPlayer()
    var postData = [productsList]()
    var player: AVPlayer!


    func automaticPlay() {
        let indexPath = IndexPath(row: 0, section: 0)
        let audioUp = postData[indexPath.row].audio
        let url = audioUp

        player = AVPlayer(url: URL(string: url!)!)

        player.volume = 1.0
        player.rate = 1.0
        if player.rate == 0 {
            player.play()
            print("It's Playing")
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        ref = Database.database().reference().child("AudioDB")
        loadProducts()

        do {
            try! AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
        }
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return postData.count
    }

    func loadProducts() {
        ref?.observe(DataEventType.value, with: { (snapshot) in
            var newSweets = [productsList]()

            for post in snapshot.children {
                let postObject = productsList(snapshot: post as! DataSnapshot)
                newSweets.append(postObject)
                print(self.postData)

            }
            self.postData = newSweets
            self.tableViewProducts.reloadData()
        }) { (error:Error) in
            print(error)
        }
    }

    //This places the text on the ViewControllerTableViewCell
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! ViewControllerTableViewCell

        let sweet = postData[indexPath.row]

        cell.idLbl.text = sweet.id
        cell.nameLbl.text = sweet.p_name

        if let profileImageUrl = sweet.image{
            let url = URL(string: profileImageUrl)
            URLSession.shared.dataTask(with: url!, completionHandler: { (data, response, error) in
                if error != nil {
                    print(error)
                    return
                }
                DispatchQueue.main.async {
                    cell.productImage.image = UIImage(data: data!)
                }
            }).resume()
        }
        return cell
    }

    var selectedRowIndex = -1

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        if indexPath.row == selectedRowIndex {
            automaticPlay()
            return 200 //Expanded
        }
        return 40//Not expanded
}
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if selectedRowIndex == indexPath.row {
            selectedRowIndex = -1

        } else {
            selectedRowIndex = indexPath.row
        }
        tableView.reloadRows(at: [indexPath], with: .automatic)
    }
}

1 Ответ

0 голосов
/ 26 апреля 2018

Комментаторы верны. Вы вызываете AutomaticPlay из неправильного места. Вызовите его из didSelectRowAt и удалите строку, определяющую indexPath, в AutomaticPlay. Вместо этого используйте indexPath, который передается в didSelectRowAt. * ​​1001 *

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