博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Swift实战-QQ在线音乐(AppleWatch版)
阅读量:5942 次
发布时间:2019-06-19

本文共 5078 字,大约阅读时间需要 16 分钟。

1.打开项目QQMusic,然后点菜单:“File-New-Target”添加appleWatch扩展项

 

2.选择Swift语言,把Include Notification Scene前的勾去掉 (项目暂时不需要做ios端的通知)

3.在 WatchKit Extension的Compile Sources 中添加QQMusic项目的需要使用的类文件

4.在QQMusic WatchKit Extension包的Images.xcassets里添加资源图片

并且在QQMusic WatchKit App的Images.xcassets里资源添加图片

(这两个的区别是,WatchKit Extension的图片是在代码里调用,而WatchKit App的图片是storyboard调用)

5.打开Interface.storyboard进行布局

6.关联各个控件IBOutLet

 
class InterfaceController: WKInterfaceController {    @IBOutlet weak var iconImage: WKInterfaceImage!    @IBOutlet weak var titleLabel: WKInterfaceLabel!    @IBOutlet weak var lrcLabel:WKInterfaceLabel!    @IBOutlet weak var playButton: WKInterfaceButton! }
 

7.加载网络mp3列表

 
override func willActivate() {        super.willActivate()        if tableData.count==0 {            //请求列表数据 provider.getSongList { (results) -> () in let errorCode:NSInteger=results["error_code"] as NSInteger let result:NSDictionary=results["result"] as NSDictionary if (errorCode==22000) { let resultData:NSArray = result["songlist"] as NSArray var list=[Song]() for(var index:Int=0;index
 

说明:willActivate方法是在页面显示前调用。

8.加载当前mp3文件,和歌词数据

 
func setCurrentSong(song:Song){      titleLabel.setText("\(song.title)-\(song.author)")      iconImage.setImage(getImageWithUrl(song.pic_premium))      self.audioPlayer.stop()        isPlaying=false self.playButton.setBackgroundImage(UIImage(named: "player_btn_play_normal.png")) getCurrentMp3(song) getCurrentLrc(song.lrclink) timer?.invalidate() timer=NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: "updateTime", userInfo: nil, repeats: true) } //获取当前mp3 func getCurrentMp3(song:Song){ provider.getSongMp3(song, reciveBlock: { (results) -> () in self.audioPlayer.contentURL=NSURL(string: results) }) } //获取歌词 func getCurrentLrc(lrclick:NSString){ currentLrcData=parseLyricWithUrl(lrclick)? }
 
 
//更新播放时间    func updateTime(){        //显示歌词        if currentLrcData != nil { let c=audioPlayer.currentPlaybackTime if c>0.0{ let all:Int=Int(c) // 查找比当前秒数大的第一条 var predicate:NSPredicate = NSPredicate(format: "total < %d", all)! var lrcList:NSArray = currentLrcData!.filteredArrayUsingPredicate(predicate) if lrcList.count > 0{ var lrcLine:SongLrc = lrcList.lastObject as SongLrc lrcLabel.setText(lrcLine.text) } } } }
 

 

9.播放、暂停当前歌曲

 
@IBAction func playSong() {        if(isPlaying==true){            //停止播放 self.audioPlayer.pause() self.playButton.setBackgroundImage(UIImage(named: "player_btn_play_normal.png")) isPlaying=false }else{ //开始/继续播放 self.audioPlayer.play() self.playButton.setBackgroundImage(UIImage(named: "player_btn_pause_normal.png")) isPlaying=true } }
 

10.实现上一首下一首歌曲的播放

 
//上一首    @IBAction func preSong() {        if(currentIndex>0){ currentIndex-- } currentSong=tableData[currentIndex] setCurrentSong(currentSong) } //下一首 @IBAction func nextSong() { if(currentIndex < tableData.count){ currentIndex++ } currentSong=tableData[currentIndex] setCurrentSong(currentSong) }
 

11.在storyBoard新建一个InterfaceController,并拖一个table控件(用于显示所有歌曲列表),将其关联SongListController

 
import Foundationimport WatchKitclass SongListController:WKInterfaceController {    var dataSource=[Song]()    //列表控件 @IBOutlet weak var table: WKInterfaceTable! //接收传过来的数据 override func awakeWithContext(context: AnyObject?) { super.awakeWithContext(context) if let data = context as? [Song]{ self.dataSource=data } } //显示列表数据 override func willActivate() { super.willActivate() table.setNumberOfRows(dataSource.count, withRowType: "SongRowType") for (index, song) in enumerate(dataSource) { if let row = table.rowControllerAtIndex(index) as? SongRowController { row.titleLabel.setText(song.title) row.subTitleLabel.setText(song.author) } } } //点击某一行返回 override func table(table: WKInterfaceTable, didSelectRowAtIndex rowIndex: Int) { let song = dataSource[rowIndex] self.dismissController() } }
 

 

12.将table控件里的rowcontroller关联SongRowController.swift

 
import Foundationimport WatchKitclass SongRowController:NSObject {    @IBOutlet weak var titleLabel: WKInterfaceLabel!    @IBOutlet weak var subTitleLabel: WKInterfaceLabel!}
 

13.按住control键,从每一个controller拖到第二个,进行页面跳转

14.在InterfaceController.swift的contextForSegueWithIdentifier方法中设置跳转页面时的传参
 
//页面使用storyBoard跳转时传参    override func contextForSegueWithIdentifier(segueIdentifier: String) -> AnyObject? {        NSLog("segueIdentifier%@", segueIdentifier) if segueIdentifier == "songListSegue"{ return self.tableData }else{ return nil } }
 

15.在SongListController.swift中的awakeWithContext方法,接收传过来的参数

 
//接收传过来的数据    override func awakeWithContext(context: AnyObject?) {        super.awakeWithContext(context)        if let data = context as? [Song]{ self.dataSource=data } }
 

 

16.进行歌曲列表的数据绑定

 
//显示列表数据    override func willActivate() {        super.willActivate()        table.setNumberOfRows(dataSource.count, withRowType: "SongRowType") for (index, song) in enumerate(dataSource) { if let row = table.rowControllerAtIndex(index) as? SongRowController { row.titleLabel.setText(song.title) row.subTitleLabel.setText(song.author) } } }
 

 

最终效果如下:

  

 

源码下载地址:http://download.csdn.net/detail/fangwulongtian/8584863

转载请注明来源:http://www.cnblogs.com/wuxian/p/4418116.html

你可能感兴趣的文章
如何解压缩后缀名为zip.001,zip.002等的文件
查看>>
OSGI企业应用开发(十二)OSGI Web应用开发(一)
查看>>
Python 以指定概率获取元素
查看>>
微信公众平台图文教程(二) 群发功能和素材管理
查看>>
关于System.Collections空间
查看>>
Centos下基于Hadoop安装Spark(分布式)
查看>>
Centos 7.5 部署DNS
查看>>
yum简介
查看>>
cp讲解
查看>>
MariaDB Galera Cluster 部署(如何快速部署MariaDB集群)
查看>>
如何在 Swift 语言下使用 iOS Charts API 制作漂亮图表?
查看>>
论代码审查的重要性
查看>>
「docker实战篇」python的docker爬虫技术-导学(一)
查看>>
linux日志基础介绍
查看>>
如何关闭SElinux
查看>>
处理器之MMU(三)
查看>>
172.16.82.0/25的含义,IP段,掩码
查看>>
测试之路
查看>>
终于对了
查看>>
RabbitMQ集群
查看>>