swift 豆瓣音乐开发案例

搞了一天,总有把swift 豆瓣音乐开发完成。

功能:某一频道列表

所有频道列表,点击返回某一频道

工程结构图

代码如下:

ViewController.swift

import UIKit
import MediaPlayer
import QuartzCore
// 文启领航 bjflexedu.com
// qq:376610000
class ViewController: UIViewController,UITableViewDataSource,UITableViewDelegate,HttpProtocol,ChannelProtocol{
    
    @IBOutlet var btnPlay : UIImageView
    @IBOutlet var tap : UITapGestureRecognizer = nil
    @IBOutlet var playTim : UILabel
    @IBOutlet var progressView : UIProgressView
    @IBOutlet var iv : UIImageView
    @IBOutlet var tv : UITableView
    var tableData:NSArray = NSArray()
    var channelData:NSArray = NSArray()
    var imageCache = Dictionary<String,UIImage>()
    var audioPlayer:MPMoviePlayerController = MPMoviePlayerController()
    var ehttp:HttpController = HttpController()
    
    var timer:NSTimer?
    
    @IBAction func onTap(sender : UITapGestureRecognizer) {
          println("tap")
        
        if sender.view == btnPlay{
            btnPlay.hidden = true
            audioPlayer.play()
            btnPlay.removeGestureRecognizer(tap)
            iv.addGestureRecognizer(tap)
            
        
        } else if sender.view == iv{
            btnPlay.hidden = false
            audioPlayer.pause()
            btnPlay.addGestureRecognizer(tap)
            iv.removeGestureRecognizer(tap)
        
        }
        
        
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        ehttp.delegate = self
        ehttp.onSearch("http://www.douban.com/j/app/radio/channels")
        ehttp.onSearch("http://douban.fm/j/mine/playlist?channel=0")
        progressView.progress = 0.0
        iv.addGestureRecognizer(tap)
        
    }
    func onChangeChannel(channel_id:String){
     let url:String = "http://douban.fm/j/mine/playlist?\(channel_id)"
       ehttp.onSearch(url)
        
    
    }
    override func   prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
        var channelC:ChannelController = segue.destinationViewController as ChannelController
        channelC.channelData = self.channelData
        println("d")
        channelC.delegate = self
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        println("dd")
        
        
    }
    func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int{
     
        return self.tableData.count
    }
 
    func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!{
     var cell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "douban")
        let rowData:NSDictionary = self.tableData[indexPath.row] as NSDictionary
        cell.text = rowData["title"] as String
        cell.detailTextLabel.text = rowData["artist"] as String
        cell.image = UIImage(named:"detail.jpg")
        let url = rowData["picture"] as String
        let image = self.imageCache[url] as?  UIImage
        
        if !image? {
            let imgURL:NSURL = NSURL(string: url)
            let request:NSURLRequest = NSURLRequest(URL: imgURL)
            NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: {
                     (response, data, error) -> Void  in
                let img = UIImage(data: data)
                cell.image = img
                self.imageCache[url] = img
                
                })
            
        }else{
        
            cell.image = image //self.imageCache["url"]
        }
        
        
       return cell
    }

    func didRecieveResults(results:NSDictionary){
    
        println("dd")
        println(results);
        if(results["song"]){
            self.tableData = results["song"] as NSArray
            self.tv.reloadData()
            let firstDict:NSDictionary = self.tableData[0] as NSDictionary
            let audioURL:String = firstDict["url"] as String
            onSetAudio(audioURL)
            
            let imgUrl:String = firstDict["picture"] as String
            onSetImage(imgUrl)
            
            
            
            
            
        }else if(results["channels"]){
            self.channelData = results["channels"] as NSArray
        
        }
        
        
    
    }
    
    func onSetAudio(url:String){
        timer?.invalidate()
        playTim.text = "00:00"
        self.audioPlayer.stop()
        self.audioPlayer.contentURL = NSURL(string: url)
        self.audioPlayer.play()
        
        timer = NSTimer.scheduledTimerWithTimeInterval(0.4,  target: self,  selector: "onUpdate", userInfo: nil, repeats: true)
        
        btnPlay.removeGestureRecognizer(tap)
        iv.addGestureRecognizer(tap)
        btnPlay.hidden = true
        
    }
    
    func onUpdate(){
        println("==")
        let currentTimer = audioPlayer.currentPlaybackTime
        if currentTimer>0.0 {
            let dur = audioPlayer.duration
            let pecent:CFloat = CFloat(currentTimer/dur)
            progressView.setProgress(pecent, animated: false)
            let all:Int = Int(currentTimer)
            let m:Int = all%60
            let f:Int = Int(all/60)
            var time:String = ""
            //小时
            if f<10{
                time = "0\(f):"
            }else{
                time = "\(f):"
            }
            // 分钟
            if m<10{
                time += "0\(m)"
            }else{
                time += "\(m)"
            }
            playTim.text = time
            
            
            
        }
    
    
    }
    
    
    func onSetImage(url:String){
    
        let image = self.imageCache[url] as? UIImage
        if !image? {
            let imgURL:NSURL = NSURL(string: url)
            let request:NSURLRequest = NSURLRequest(URL: imgURL)
            NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: {
                (response, data, error) -> Void  in
                let img = UIImage(data: data)
                self.iv.image = img
                self.imageCache[url] = img
                
                })
            
        }else{
             self.iv.image = image
           
        }
        
    }
    //选择其中之一
    func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!){
        
        var rowData:NSDictionary = self.tableData[indexPath.row] as NSDictionary
        let url = rowData["url"] as String
        onSetAudio(url)
        let urlImg = rowData["picture"] as String
        onSetImage(urlImg)
    }
    //动画效果
    func tableView(tableView: UITableView!, willDisplayCell cell: UITableViewCell!, forRowAtIndexPath indexPath: NSIndexPath!){
        
     cell.layer.transform = CATransform3DMakeScale(0.1,0.1,1)
        
     UIView.animateWithDuration(0.25,animations:{
         cell.layer.transform = CATransform3DMakeScale(1,1,1)
            
        })
    
    }
    
    
}

ChannelProtocol.swift

import UIKit
import QuartzCore
// 文启领航 bjflexedu.com
// qq:376610000
protocol ChannelProtocol{
    func onChangeChannel(channel_id:String)
}

class ChannelController: UIViewController,UITableViewDataSource,UITableViewDelegate {
    
    
    @IBOutlet var tv : UITableView
    var channelData:NSArray = NSArray()
    var delegate:ChannelProtocol?
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int{
        
        return channelData.count
    }
    func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!{
        let cell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "channel")
        let rowData:NSDictionary = self.channelData[indexPath.row] as NSDictionary
        cell.text = rowData["name"] as String
        cell.image = UIImage(named:"detail.jpg")
//        cell.detailTextLabel.text = rowData["channel_id"] as String
    return cell
    }
    //
    func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!){
        
        var rowData:NSDictionary = self.channelData[indexPath.row] as NSDictionary
        let channel_id:AnyObject = rowData["channel_id"] as AnyObject
        let channel:String = "channel=\(channel_id)"
        
        self.delegate?.onChangeChannel(channel)
        
        self.dismissViewControllerAnimated(true, completion: nil)
      }
    //动画效果
    func tableView(tableView: UITableView!, willDisplayCell cell: UITableViewCell!, forRowAtIndexPath indexPath: NSIndexPath!){
        
        cell.layer.transform = CATransform3DMakeScale(0.1,0.1,1)
        
        UIView.animateWithDuration(0.25,animations:{
            cell.layer.transform = CATransform3DMakeScale(1,1,1)
            
            })
        
    }
    
    
}

HttpProtocol.swift

import UIKit
// 文启领航 bjflexedu.com
// qq:376610000
protocol HttpProtocol{

    func didRecieveResults(results:NSDictionary)

}

class HttpController:NSObject{
    
    var delegate:HttpProtocol?
    
    func onSearch(url:String){
        var nsUrl:NSURL = NSURL(string: url)
        var request:NSURLRequest = NSURLRequest(URL: nsUrl)
        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: {
             (response, data, error) -> Void in
            var jsonResult:NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary
            self.delegate?.didRecieveResults(jsonResult)
            
            
            
            
            })
        
    
    }

    
    
    

}
时间: 2024-08-08 13:48:06

swift 豆瓣音乐开发案例的相关文章

《云阅》一个仿网易云音乐UI,使用Gank.Io及豆瓣Api开发的开源项目

CloudReader 一款基于网易云音乐UI,使用GankIo及豆瓣api开发的符合Google Material Desgin阅读类的开源项目.项目采取的是Retrofit + RxJava + MVVM-DataBinding架构开发.开发中所遇到的各种问题已归纳在这里. github地址:CloudReader What can be learned about this project 那么,从本项目中你能学到哪些知识呢? 1.干货集中营内容与豆瓣电影书籍内容. 2.高仿网易云音乐歌单

Swift游戏开发案例实战——互动出版网

这篇是计算机类的优质推荐>>>><Swift游戏开发案例实战> 国内第一本Swift游戏开发图书,系统地讲解了Swift 游戏开发的基础知识和各项关键技术 编辑推荐 *国内第一本Swift游戏开发图书,系统地讲解了Swift 游戏开发的基础知识和各项关键技术: *详细讲解了5个游戏的开发过程,如记忆配对.太空侵略者.Simon记忆.迷你高尔夫.银河大战.这些项目将帮助读者更好地理解iOS项目开发的方式和流程: *结合案例,重点对图形.音频和交互等与游戏紧密相关的知识做了

【小程序源码案例】微信小程序项目开发案例分享

作者:web小二本文标签: 微信小程序 小程序源码案例 小程序项目小程序的开发,并不是适合所有公司,我今天跟大家分享小程序方面的教程,主要是供大家学习使用.学习这种东西,有时候则是单纯的喜欢,没有任何目的,很单纯的为了好玩,记得很早之前学flash,没有想法,就是觉得好玩,纯娱乐爱好而已.到后来玩视频剪辑也是出于同样的原因,不图钱财名利,只是图自己个人爱好娱乐. 但是,学习,有时候则是需要有明确目的,特别是关系到自己吃饭问题的时候,你就需要非常有目的去学习,并且还需要制定好学习的计划与目标,希望

jplogic 快速开发平台开发案例其一

jplogic v1.0开发陆续更新,意在和广大网友分享交流,通过寻求合作伙伴,交流群376447127.下面是jplogic的关于知识库模块的部分功能,如下进行功能展示: 知识库主界面: 新增知识类别: 新增文档: 调整类别结构: 附件明细操作: 文档信息查看:(将上传的各种文本文件转化成swf格式,便可以实现仿百度文库在线阅读功能) 海量知识库文档高级检索(数据库检索.索引检索(全文检索))等功能. jplogic 快速开发平台开发案例其一,布布扣,bubuko.com

Swift 新语言开发

全书目录: 一.Welcome to Swift 二.Language Guide 三.Language Reference /* 译者的废话: 几个小时前熬夜看了WWDC,各种激动,今年很有料啊!当看到Swift出来的时候,瞬间傻眼,又要学习新语言了.这篇文章来自苹果官方的<The Swift Programming Language>一书,500页左右,在苹果官网有下载.Swift大家都没实际用过,本翻译一定是有各种错漏的,各位多多包涵,我会不断更新修正的. --(博客园.新浪微博)葛布林

使用Jquery+EasyUI进行框架项目开发案例解说之中的一个---员工管理源代码分享

使用Jquery+EasyUI 进行框架项目开发案例解说之中的一个 员工管理源代码分享 在開始解说之前,我们先来看一下什么是Jquery EasyUI?jQuery EasyUI是一组基于jQuery的UI插件集合,而jQuery EasyUI的目标就是帮助web开发人员更轻松的打造出功能丰富而且美观的UI界面.开发人员不须要编写复杂的javascript,也不须要对css样式有深入的了解,开发人员须要了解的仅仅有一些简单的html标签.jQuery EasyUI为我们提供了大多数UI控件的使用

使用Jquery+EasyUI 进行框架项目开发案例讲解之五 模块(菜单)管理源码分享

http://www.cnblogs.com/huyong/p/3454012.html 使用Jquery+EasyUI 进行框架项目开发案例讲解之五  模块(菜单)管理源码分享    在上四篇文章  <使用Jquery+EasyUI进行框架项目开发案例讲解之一---员工管理源码分享>  <使用Jquery+EasyUI 进行框架项目开发案例讲解之二---用户管理源码分享>  <使用Jquery+EasyUI 进行框架项目开发案例讲解之三---角色管理源码分享> <

Kendo UI经典开发案例赏析

Kendo UI 是一个非常强大的HTML5界面开发框架,基于最新的HTML5.CSS3和JavaScript标准,既可以开发Web应用,又可以开发跨平台的移动应用.Kendo UI的界面风格清新大气,组件功能完善,性能可靠,程序员只需要少量编码就可以实现相应的效果,能节省大量的时间成本.那么Kendo UI到底能实现一些什么样的效果呢?下面我汇总了Kendo UI的四个开发案例 Bootstrap 经常有人问到Kendo UI是否可以和Bootstrap 结合使用,答案当然是肯定的.这个应用是

netty&mdash;&mdash;私有协议栈开发案例

netty--私有协议栈开发案例 摘要: 在学习李林峰老师的Netty权威指南中,觉得第十二章<私有协议栈开发>中的案例代码比较有代表性,讲的也不错,但是代码中个人认为有些简单的错误,个人经过简单的修改,编译好后展示给大家,有什么问题,希望留言,共同交流: 相关包: meven配置: <dependency>            <groupId>io.netty</groupId>            <artifactId>netty-a