Swift实战-QQ在线音乐(AppleWatch版)
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== {
//请求列表数据
provider.getSongList { (results) -> () in
let errorCode:NSInteger=results["error_code"] as NSInteger
let result:NSDictionary=results["result"] as NSDictionary
if (errorCode==) {
let resultData:NSArray = result["songlist"] as NSArray
var list=[Song]()
for(var index:Int=;index<resultData.count;index++){
var dic:NSDictionary = resultData[index] as NSDictionary
var song:Song=Song()
song.setValuesForKeysWithDictionary(dic as NSDictionary)
list.append(song)
}
self.tableData=list
self.setCurrentSong(list[] as Song)
}
}
}
}
说明: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 > {
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>){
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 Foundation
import WatchKit class 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 Foundation
import WatchKit class 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
Swift实战-QQ在线音乐(AppleWatch版)的更多相关文章
- Swift实战-QQ在线音乐(第二版)
此版本使用百度音乐接口,原因是豆瓣接口很多歌曲没办法找到歌词. 此版本添加了歌词的显示.上一曲.下一曲的实现.歌曲列表指明当前歌曲. 下面来看一下实现过程>>> 一.项目准备: 百度 ...
- Swift实战-QQ在线音乐(第一版)
//一.*项目准备 1.QQ音乐App 界面素材:(我使用PP助手,将QQ音乐App备份,解压ipa文件 即可得到里面的图片素材) 2.豆瓣电台接口:"http://douban.fm/j/ ...
- javascript版QQ在线聊天挂件
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Swift实战-豆瓣电台(五)播放音乐
观看地址 http://v.youku.com/v_show/id_XNzMwODM0MzI0.html 在这节里面,我们简单学习了一下MediaPlayer的使用 引入媒体框架 import Med ...
- python 开发在线音乐播放器-简易版
在线音乐播放器,使用python的Tkinter库做了一个界面,感觉这个库使用起来还是挺方便的,音乐的数据来自网易云音乐的一个接口,通过urllib.urlopen模块打开网址,使用Json模块进行数 ...
- iOS传感器集锦、飞机大战、开发调试工具、强制更新、Swift仿QQ空间头部等源码
iOS精选源码 飞机大作战 MUPhotoPreview -简单易用的图片浏览器 LLDebugTool是一款针对开发者和测试者的调试工具,它可以帮... 多个UIScrollView.UITable ...
- Andriod小项目——在线音乐播放器
转载自: http://blog.csdn.net/sunkes/article/details/51189189 Andriod小项目——在线音乐播放器 Android在线音乐播放器 从大一开始就已 ...
- 微信公众平台中添加qq在线聊天代码
微信公众平台是个不错的媒体,可以和你的小伙伴们即时交流,但你的小伙伴们是用手机上的微信,打字自然就慢了:有人说用微信网页版,那个也不习惯,再说也不一定所有人都知道网页版微信.(2014.01.22更新 ...
- Swift实战-豆瓣电台(九)简单手势控制暂停播放(全文完)
Swift实战-豆瓣电台(九)简单手势控制暂停播放 全屏清晰观看地址:http://www.tudou.com/programs/view/tANnovvxR8U/ 这节我们主要讲UITapGestu ...
随机推荐
- razor 添加html5属性
在 HTML5 中, 可以使用 data- 属性来表示用户数据,这些数据甚至可以是 JSON 格式的数据,对 Web 前端开发带来很大的方便. 在 MVC 的 Razor 中,可以使用匿名对象来生成定 ...
- osgi 命令
安装命令 install reference:file:D:/workspace/workspace-osgi/MsgBoxCreateModule 根据 返回的 ID再运行start
- WCF TCP 错误代码 10061: 由于目标计算机积极拒绝
表象是连不上服务端,本质原因多种多样,网络硬件问题导致的网络不通.服务本身问题或没有启动.或者防火墙阻隔等等不一而足. 1.ping看服务端能否ping通: 2.telnet ip地址 端口 ,看看是 ...
- php--group by
1. GROUP BY 是分组查询, 一般 GROUP BY 是和聚合函数配合使用 group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by ...
- 【SQL Server】左联接,右联接,内联接的比较
首先需要解释一下这几个联接的意思: left join(左联接): 返回包括左表中的所有记录和右表中联结字段相等的记录. right join(右联接): 返回包括右表中的所有记录和左表中联结字段相等 ...
- partial类与[MetadataType(typeof(类名))]有什么区别?
在MVC的Model中,我们可以定义很多与视图相关的元数据,这些元数据对我们开发视图起着相当重要的作用,特别是在数据验证方面.这些元数据一般情况下我们是不会定义在业务实体(或持久化实体)上面,所以很多 ...
- 实验一补充内容 Java开发环境的熟悉-刘蔚然
本次实验 PSP时间统计 步骤 耗时百分比 需求分析 5% 设计 10% 代码实现 67% 测试 15% 分析总结 3%
- windows SVN搭建
Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先来下载和搭建SVN服务器. 现在Subversion已经迁移到apache网站上了,下载地址: http:// ...
- Segments---poj3304(判断直线与线段的位置关系)
题目链接:http://poj.org/problem?id=3304 题意:给你n个线段,求是否有一条直线与所有的线段都相交,有Yes,没有No; 枚举所有的顶点作为直线的两点,然后判断这条直线是否 ...
- HTML5样式和列表、CSS链接的四种状态
一.HTML5样式 1.标签: <style>:样式定义: <link>:资源引用: 2.属性: type="text/css":引入文档类型: rel=& ...