使用Swift开发一个贝乐虎启蒙App – 听故事

这是我参与8月更文挑战的第11天,活动详情查看:8月更文挑战

前言

贝乐虎的视频播放已经完成了,下面我们就开始做听故事(音频播放),不过这个只能播放一小部分,因为获取音频播放的url需要签名,不知道其签名规则,所以只能播放那些不需要签名的。

故事列表

IMG_0240.PNG

1、新建一个RecAudioListViewController,暴露三个属性

var atype: String = ""
var id: String = ""
var outerid: String = ""
复制代码

2、上面的介绍是固定在导航栏下面的,新建一个RecAudioHeaderView,然后再RecAudioListViewController里面初始化

private lazy var headerView: RecAudioHeaderView = {
    RecAudioHeaderView()
}()
复制代码

3、下面就是tableView

private lazy var tableView: UITableView = {
    let view = UITableView(frame: .zero, style: .plain)
    view.separator(left: space, right: 0)
    view.plainFooterView()
    view.rowHeight = 55.fit
    view.delegate = self
    view.dataSource = self
    view.register(cellWithClass: RecAudioListCell.self)
    return view
}()

extension RecAudioListViewController: UITableViewDelegate, UITableViewDataSource {

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withClass: RecAudioListCell.self)
        cell.countLabel.text = "\(indexPath.row + 1)"
        cell.update(dataSource[indexPath.row])
        return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let vc = AudioPlayerViewController.share
        vc.atype = atype
        vc.audioModel = audioModel
        vc.dataSource = dataSource
        vc.playerIndex = indexPath.row
        vc.didAudioItemModeChange = { [weak self] in
            guard let `self` = self else { return }
            self.refreshSeletedData()
        }
        vc.playerURL()
        push(vc)
    }
}
复制代码

4、请求数据

extension RecAudioListViewController {
    
    /// 如果atype是2的话,只需要请求这一个接口,如果是其他的话还要请求下面的
    private func requestData() {
        Network.Rec
            .audioAlbum(id: id, page: page)
            .request()
            .responseData(AudioModel.self) { [weak self] (model) in
                guard let `self` = self else { return }
                /// 结束mj footer刷新
                self.tableView.endFooterRefresh()
                /// 更新详情信息
                self.headerView.update(model.result.album)
                self.audioModel = model.result
                if self.atype == "2" {
                    if self.tableView.isHeaderRefresh {
                        self.dataSource.removeAll()
                    }
                    self.tableView.endHeaderRefresh()
                    self.dataSource.append(contentsOf: model.result.items)
                    self.refreshSeletedData()
                }
        } failure: { [weak self] (error) in
            guard let `self` = self else { return }
            self.tableView.endHeaderRefresh()
            self.tableView.endFooterRefresh()
            Toast.show(info: error.errorMessage)
        }
    }

    /// 如果atype不等于2的话,用这个接口来请求列表数据
    private func requestAudioList() {
        Network.Rec
            .audioList(id: outerid, page: page)
            .request()
            .responseAudioData([AudioItemModel].self) { [weak self] (model) in
                guard let `self` = self else { return }
                if self.tableView.isHeaderRefresh {
                    self.dataSource.removeAll()
                }
                self.tableView.endHeaderRefresh()
                self.tableView.endFooterRefresh()
                self.dataSource.append(contentsOf: model.data)
                self.refreshSeletedData()
        } failure: { [weak self] (error) in
            guard let `self` = self else { return }
            self.tableView.endHeaderRefresh()
            self.tableView.endFooterRefresh()
            Toast.show(info: error.errorMessage)
        }
    }
}
复制代码

5、选中的数据状态处理

/// 刷新正在播放的数据,因为音频播放页面返回到首页都是可以播放的,所以使用单例
/// 放的音频和列表数据做对比,如果id一致,设置isSelected = false
private func refreshSeletedData() {
    let item = AudioPlayerViewController.share.playerItemModel
    dataSource = dataSource.map { model -> AudioItemModel in
        var m = model
        if m.id == item.id {
            m.isSelected = true
        } else {
            m.isSelected = false
        }
        return m
    }
    tableView.reloadData()
}
复制代码

IMG_0241.PNG

列表比较简单,下一篇我们开始封装一个音频播放功能

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享