音乐列表首页TableView:
// // MusicTableViewController.swift // Music_Swift // // Created by zhangfei on 15/08/17. // Copyright © 2015年 zhangfei. All rights reserved. // import UIKit class MusicTableViewController: UITableViewController { override func viewDidLoad() { super.viewDidLoad() //创建管理类对象,实现数据请求 DataManager.shareDataManager.requestDatas() DataManager.shareDataManager.block = { //回调block,数据请求完成实现页面刷新 self.tableView.reloadData() } //注册自定义cell tableView.registerNib(UINib(nibName: "MusicCell", bundle: nil), forCellReuseIdentifier: "cellID") print(DataManager.shareDataManager.allDataArray()) } //正在播放按钮监听事件 @IBAction func PlayingBtnAction(sender: UIButton) { let VC = PlayMusicController.sharePlayMusicController VC.view.backgroundColor = UIColor.whiteColor() VC.index = -1 print(VC.index) showDetailViewController(VC, sender: VC.index) } //内存溢出 override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() if self.isViewLoaded() && self.view.window == nil { self.view = nil } } } extension MusicTableViewController { //设置tableView有几行 override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return DataManager.shareDataManager.allDataArray().count } //显示cell的内容 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("cellID", forIndexPath: indexPath) as! MusicCell let music = DataManager.shareDataManager.allDataArray()[indexPath.row] cell.music = music return cell } //返回行高 override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return 160 } //点击事件触发方法 override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { let VC = PlayMusicController.sharePlayMusicController VC.view.backgroundColor = UIColor.whiteColor() // print("!!!!!!!!!!\(indexPath.row)") VC.index = indexPath.row // print(VC.index) self.showDetailViewController(VC, sender: VC.index) } }
音乐Model类:
// // Music.swift // Music_Swift // // Created by zhangfei on 15/08/17. // Copyright © 2015年 zhangfei. All rights reserved. // import UIKit class Music: NSObject { var mp3Url: String! var myID: String! var name: String! var picUrl: String! var blurPicUrl: String! var album: String! var singer: String! var durationStr: String! var artists_name: String! var lyric: String! override func setValue(value: AnyObject?, forUndefinedKey key: String) { if key == "id" { self.myID = String(value!) // self.myID = String(strideofValue(value as! NSNumber)) } if key == "duration" { self.durationStr = String(value!) // self.durationStr = String(strideofValue(value as! NSNumber)) } } }
音乐列表自定义cell:
// // DataManager.swift // Music_Swift // // Created by zhangfei on 15/08/17. // Copyright © 2015年 zhangfei. All rights reserved. // import UIKit typealias myBlock = () ->Void class DataManager: NSObject { static let shareDataManager = DataManager() private var dataArray = [Music]() var count: Int? { get { return self.dataArray.count } } var block: myBlock? func requestDatas() ->Void { dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in // let url = NSURL(string: kMusicURL) let array = NSArray(contentsOfURL: url!) for item in array! { let music = Music() music.setValuesForKeysWithDictionary(item as! [String : AnyObject]) let mp3Url = item["mp3Url"] let myID = item["id"] let name = item["name"] let picUrl = item["picUrl"] let blurPicUrl = item["blurPicUrl"] let album = item["album"] let singer = item["singer"] let duration = item["duration"] let artists_name = item["artists_name"] let lyric = item["lyric"] let music = Music(mp3Url: "\(mp3Url)", myID: "\(myID)", name: "\(name)", picUrl: "\(picUrl)", blurPicUrl: "\(blurPicUrl)", album: "\(album)", singer: "\(singer)", duration: "\(duration)", artists_name: "\(artists_name)", lyric: "\(lyric)") self.dataArray.append(music) } dispatch_async(dispatch_get_main_queue(), { () -> Void in // self.block!() }) } } func allDataArray() ->Array<Music> { let arr = self.dataArray return arr } func selectMusicForIndexPath(indexPath: NSIndexPath) ->Music { return self.dataArray[indexPath.row] } }
音乐Model管理类:
// // DataManager.swift // Music_Swift // // Created by zhangfei on 15/08/17. // Copyright © 2015年 zhangfei. All rights reserved. // import UIKit typealias myBlock = () ->Void class DataManager: NSObject { static let shareDataManager = DataManager() private var dataArray = [Music]() var count: Int? { get { return self.dataArray.count } } var block: myBlock? func requestDatas() ->Void { dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in // let url = NSURL(string: kMusicURL) let array = NSArray(contentsOfURL: url!) for item in array! { let music = Music() music.setValuesForKeysWithDictionary(item as! [String : AnyObject]) let mp3Url = item["mp3Url"] let myID = item["id"] let name = item["name"] let picUrl = item["picUrl"] let blurPicUrl = item["blurPicUrl"] let album = item["album"] let singer = item["singer"] let duration = item["duration"] let artists_name = item["artists_name"] let lyric = item["lyric"] let music = Music(mp3Url: "\(mp3Url)", myID: "\(myID)", name: "\(name)", picUrl: "\(picUrl)", blurPicUrl: "\(blurPicUrl)", album: "\(album)", singer: "\(singer)", duration: "\(duration)", artists_name: "\(artists_name)", lyric: "\(lyric)") self.dataArray.append(music) } dispatch_async(dispatch_get_main_queue(), { () -> Void in // self.block!() }) } } func allDataArray() ->Array<Music> { let arr = self.dataArray return arr } func selectMusicForIndexPath(indexPath: NSIndexPath) ->Music { return self.dataArray[indexPath.row] } }
音乐播放器AVPlayer管理类
// // PlayerHelper.swift // Music_Swift // // Created by zhangfei on 15/08/17. // Copyright © 2015年 zhangfei. All rights reserved. // import UIKit import AVFoundation //设置代理 protocol PlayerHelperDelegate { func playStop() func playingWithTime(time: Double) } class PlayerHelper: NSObject { static let sharePlayerHelper = PlayerHelper() var player = AVPlayer() var isPlaying = Bool() var timer = NSTimer() var delegate: PlayerHelperDelegate? override init() { super.init() NSNotificationCenter.defaultCenter().addObserver(self, selector: "playToStop", name: AVPlayerItemDidPlayToEndTimeNotification, object: nil) } func playToStop() ->Void { self.delegate!.playStop() } //播放音乐 func playMusicWithURL(stringUrl: NSURL) ->Void { let playerItem = AVPlayerItem(URL: stringUrl) self.player.replaceCurrentItemWithPlayerItem(playerItem) //添加观察者 player.addObserver(self, forKeyPath: "status", options: .New, context: nil) } override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { if keyPath == "status" { print(player.status) if player.status == .ReadyToPlay { self.play() } } } //播放 func play() ->Void { if isPlaying == true { return } player.play() isPlaying = true timer = NSTimer.scheduledTimerWithTimeInterval(0.05, target: self, selector: "timerAction", userInfo: nil, repeats: true) } //暂停 func pause() ->Void { timer.invalidate() if isPlaying == false { return } player.pause() isPlaying = false } func timerAction() ->Void { let time = self.player.currentTime().value / self.player.currentTime().timescale self.delegate!.playingWithTime(time) } //声音 func volumeWithVolumeSliderValue(value: Float) ->Void { player.volume = value } }
音乐播放页面(单例控制器):
// // PlayMusicController.swift // Music_Swift // // Created by zhangfei on 15/08/17. // Copyright © 2015年 zhangfei. All rights reserved. // import UIKit class PlayMusicController: UIViewController { //单例方法 static var sharePlayMusicController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("playID") as! PlayMusicController //声明属性 var index: Int! var currtentIndex: Int! var currtentMusic: Music! //UI界面属性 @IBOutlet weak var nameLabel: UILabel! @IBOutlet weak var singerLabel: UILabel! @IBOutlet weak var imgView: UIImageView! @IBOutlet weak var tableBackImage: UIImageView! @IBOutlet weak var tableView: UITableView! //UI界面点击事件 @IBAction func disBtnAction(sender: UIButton) { dismissViewControllerAnimated(true, completion: nil) } @IBAction func durtionSliderAction(sender: UISlider) { } @IBAction func volumeSliderAction(sender: UISlider) { PlayerHelper.sharePlayerHelper.volumeWithVolumeSliderValue(sender.value) } @IBAction func popBtnAction(sender: UIButton) { currtentIndex = currtentIndex - 1 if currtentIndex < 0 { currtentIndex = 199 } self.preparePlayMusic() } @IBAction func playOrPauseBtnAction(sender: UIButton) { if PlayerHelper.sharePlayerHelper.isPlaying == true { PlayerHelper.sharePlayerHelper.pause() }else { PlayerHelper.sharePlayerHelper.play() } } @IBAction func nextBtnAction(sender: UIButton) { currtentIndex = currtentIndex + 1 if currtentIndex > DataManager.shareDataManager.allDataArray().count - 1 { currtentIndex = 0 } self.preparePlayMusic() } } extension PlayMusicController { override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) print(index) if index == -1 { return } if currtentIndex == index { return } currtentIndex = index! self.preparePlayMusic() } func preparePlayMusic() ->Void { self.currtentMusic = DataManager.shareDataManager.allDataArray()[currtentIndex] self.loadViewInfo() PlayerHelper.sharePlayerHelper.playMusicWithURL(NSURL(string: currtentMusic.mp3Url)!) } func loadViewInfo() ->Void { self.nameLabel.text = currtentMusic.name self.singerLabel.text = currtentMusic.singer let currentUrl = NSURL(string: currtentMusic.picUrl) self.imgView.sd_setImageWithURL(currentUrl) } override func viewDidLoad() { super.viewDidLoad() self.currtentIndex = -2 // Do any additional setup after loading the view. } }