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==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<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[0] 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 > 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 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

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

时间: 2024-12-03 09:16:29

Swift实战-QQ在线音乐(AppleWatch版)的相关文章

Swift实战-QQ在线音乐(第二版)

此版本使用百度音乐接口,原因是豆瓣接口很多歌曲没办法找到歌词. 此版本添加了歌词的显示.上一曲.下一曲的实现.歌曲列表指明当前歌曲. 下面来看一下实现过程>>> 一.项目准备: 百度音乐国语歌曲列表Api接口: http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.song.getSmartSongList&page_no=1&page_size=50&scene_id=42&

Swift实战-QQ在线音乐(第一版)

//一.*项目准备 1.QQ音乐App 界面素材:(我使用PP助手,将QQ音乐App备份,解压ipa文件 即可得到里面的图片素材) 2.豆瓣电台接口:"http://douban.fm/j/mine/playlist?channel=1" //二.*界面布局使用Xcode新建一个Single View Application项目,选择Swift语言. 导入素材图片.在默认的ViewController视图进行以下布局. 界面控件不多,如图将几个关键控件布局就可以了. //三.*背景模糊

零基础Swift实战开发从入门到精通(4大项目实战、酷跑熊猫、百度音乐、足球游戏等)

第一部分:Swift基础语法 第1节:变量 第2节:常量 第3节:使用PlayRound编写Swift程序 第4节:类型检查与推断 第5节:类型别名 第6节:计算器 第二部分:字符和字符串 第1节:字符(Characters) 第2节:字符串-定义 第三部分:数据类型(DataType) 第1节:整型(int.Uint) 第2节:浮点数 第3节:Bool 第四部分:数据类型转换 第1节字符串转换数字类型 第2节数字类型转换字符串 第3节:数字类型之间转换 更多............ 项目实战一

零基础Swift实战开发视频教程_从入门到精通

零基础Swift实战开发从入门到精通(4大项目实战.酷跑熊猫.百度音乐.足球游戏等)适合人群:初级课时数量:50课时更新程度:86%用到技术:Swift涉及项目:酷跑熊猫.百度音乐.足球游戏咨询qq:1840215592零基础Swift实战开发视频教程采用基础+项目的方式进行讲解,通过基础的学习,可以完全掌握Swift基本语法应用,并结合4个项目进行开发,学员能在最短的时间内掌握开发的各项技能. 零基础Swift实战开发从入门到精通详细查看:http://www.ibeifeng.com/goo

音乐网站开发,在线音乐网站建设,DJ音乐网站制作

本公司专业承接音乐网站开发,在线音乐网站建设,DJ音乐网站制作,手机音乐网站制作开发等服务,需要的朋友可以私聊,谢谢. 支持定制,电脑版,手机版,微信版,小程序版,APP版提供一站式服务:联系QQ:2 3 6 0 2 4 8666(私聊),微信:luenmicro 电话:181-2795-0266 原文地址:http://blog.51cto.com/14052561/2313778

在线音乐迎来大变局 掘金粉丝各出奇招

在线音乐在2016年将真正迎来其十年孕育期后的大爆发,在版权最严令的利好下,模式之变将更深层次的在粉丝经济下全面展开,而谁能真正让粉丝在长期的共享经济熏陶下,乐于慷慨解囊. 文/张书乐 据媒体报道,10日,多米音乐宣布获得华谊.磐石.七匹狼及喜之郎联合投资.同时,多米音乐宣布与中国移动旗下全资子公司咪咕文化达成合作,除了在音乐领域开展线上线下深度捆绑合作外,还将在视频.阅读.游戏.动漫各方面为粉丝提供全方位的服务,探索在线音乐新的盈利模式. 这是继网易云音乐.QQ音乐.百度音乐等多个平台之后,又

Andriod小项目——在线音乐播放器

Android在线音乐播放器 从大一开始就已经开始自学Java和Android了,到现在差不多有一年了. 终于到了开始做项目实战的阶段了.就先DIY个在线音乐播放器. 实现了以下功能: 这个播放器可以从本机电脑搭建的简易服务器里异步读取并解析json数据,播放音乐,实现音乐切换,时间显示,以及显示播放进度. 程序有三个界面,启动画面,音乐列表,播放器页面,可以通过音乐列表点击进入到播放界面. 这篇文章只大概写了一下实现的思路,描述了一些关键的地方. 文章最后还提供了源代码,可以在文章结尾处  下

拯救在线音乐?Apple Watch还要做的更多

Apple Watch的发布最终尘埃落定,不管是对天价的吐槽,还是对续航的无奈,抑或是看到时尚单品的欣喜,都只是个人的感受.而对于整个互联网.智能硬件市场乃至相关行业来说,Apple Watch带来的震动才刚刚开始.其中,对于在线音乐行业来说,或将是一个华丽的转折点. 不过实事求是地说,我们也应该看到Apple Watch本身的定位--时尚和科技真正的融合产品.而时尚只是小部分人才享有的--价格在那里放着,Apple Watch要想真正拯救在线音乐行业,或许还要做出更多努力. Apple Wat

debian(wheezy)安装sockso在线音乐共享,分享服务

前言, 同事想要可以在web端直接播放我的机器里面的音乐,并且能有选择分类等的功能, 以前的ample局域网音乐广播服务就有些力不从心了. 这时候我们就采用sockso来实现这个. 官网地址 http://sockso.pu-gh.com/ sockso支持mp3,m4a,ogg,wma,flac等格式,有一个比较友好的界面,类似以前的在线音乐播放,并且有一些数据的统计功能,播放了哪些,哪些最热心,列表也支持拖拽操作. 下载linux版,地址在这里http://sockso.googlecode