In this tutorial I am going to create simple audio player to play list of songs in iOS devices. Songs are added to resource files
Following user interface controllers are used to build this App
UITableView
UIProgressBar
UIButton
UILabel
Your finished App will be like this
Now we will see how we are going to build the above App step by step using Swift language
(1) Create Single View Application and Add Songs
First create the single view application in XCODE and then drag and drop the song folder into Project Navigator
(2) Add UITableVew to ViewController
Now I want to show these songs in the UITableVew
.
Select Main.storyboard file and click on the View Controller. Now you can drag and drop the UITableView
from the Object Library into the View Controller
To work with UITableView
you need two protocol UITableViewDelegate
, UITableViewDataSource
so you need to implement these two protocol under ViewController
class.
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } overridefunc didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }
(3) Create Outlet for UITableView
Now you can create IBOutlet for the UITableView
c @IBOutlet weak var tableView: UITableView!
(4) Loading songs to array
In this step you can define the array and load the songs to array
Add the following code to to your ViewController class
var songs: [String] = []
To get the songs from the resource folder I am going to write a function getSongs()
which will return the array of songs
func getSongs() -> [String] { var names: [String] = [] let path = Bundle.main.resourceURL?.appendingPathComponent("songs") do{ let songs = try FileManager.default.contentsOfDirectory(at: path!, includingPropertiesForKeys: nil, options: FileManager.DirectoryEnumerationOptions.skipsHiddenFiles) for song in songs{ let strArray = song.absoluteString.components(separatedBy: "/") var songName = strArray[strArray.count-1].replacingOccurrences(of: "%20", with: " ") songName = songName.replacingOccurrences(of: ".mp3", with: "") names.append(songName) } }catch{} return names }
So this is our getSong() function to get list of the songs. You call this function inside the viewDidLoad()
function
songs = getSongs()
(5) Show the songs in UITableView
Now you have the songs loaded to your array and you want to display them in the UITableView
. You need following two methods to display songs in the UITableView
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.songs.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell:UITableViewCell = self.tableView.dequeueReusableCell(withIdentifier: "cell")! cell.textLabel?.text = self.songs[indexPath.row] return cell }
Next thing you have to do is, add the following code to viewDidLoad() function
self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell") tableView.delegate = self tableView.dataSource = self
Now you can run the application and you should get following screen in your simulator
(6) Play the song when you touch the row in UITableView
Now you can start code to play the song when you touch the row in the UITableView
First import the AVFoundation library
import AVFoundation
Then create the varibale for the audio player
var player = AVAudioPlayer()
Then I am going to create playSong(index: Int)
. This function will take one argument which is the index of the row of the UITableView. Based on the integer value I can get the name of the song from the array and then I can look for the path of the song from the resource bundle
func playSong(index: Int){ do{ let songPath = Bundle.main.path(forResource: songs[index], ofType: ".mp3", inDirectory: "songs") try player = AVAudioPlayer(contentsOf: URL(fileURLWithPath: songPath!)) player.play() }catch{} }
Now you need to call above method when user touch the row. So we have following method for it
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { playSong(index: indexPath.row) }