2017-06-01 3 views
1

Ich habe einen TableView-Controller, der eine Liste von Songs hat, und wenn ein Benutzer auf einen Song klickt, öffnet er einen anderen View-Controller und spielt ihn ab. Ich brauche Hilfe immer wenn der Benutzer die nächste Taste oder vorher drückt, so dass es den vorherigen oder nächsten Song spielt. Hier ist mein Tableviewcontroller:Play Next Song AVAudioPlayer

import UIKit 

class LibraryTableViewController: UITableViewController { 

    var titleText = ["Heroes", "Skyline", "In The Woods"] 
    var authorText = ["Kedam", "Kovan & Electro Light", "Max Pros"] 

    @IBOutlet var songList: UITableView! 


    override func viewDidLoad() { 
     super.viewDidLoad() 



    } 


    // MARK: - Table view data source 

    override func numberOfSections(in tableView: UITableView) -> Int { 
     // #warning Incomplete implementation, return the number of sections 
     return 1 
    } 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     // #warning Incomplete implementation, return the number of rows 
     return titleText.count 
    } 

    //tableview delegate 

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     var cell : LibrarySongTableViewCell! = tableView.dequeueReusableCell(withIdentifier: "Library Cell") as! LibrarySongTableViewCell 
     if(cell == nil) 
     { 
      cell = Bundle.main.loadNibNamed("Library Cell", owner: self, options: nil)?[0] as! LibrarySongTableViewCell; 
     } 
     let titleTitle = titleText[indexPath.row] as String //NOT NSString 
     let authorTitle = authorText[indexPath.row] as String 
     cell.titleLabel.text=titleTitle 
     cell.authorLabel.text=authorTitle 
     cell.imageView?.image = UIImage(named: titleTitle) 
     cell.imageView?.layer.cornerRadius = 5 
     return cell as LibrarySongTableViewCell 

    } 


    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    { 
     if segue.identifier == "toLibraryDetail" 
     { 
      let detailViewController = ((segue.destination) as! LibraryDetailViewController) 
      let indexPath = self.songList!.indexPathForSelectedRow! 
      let topicLabelText = titleText[indexPath.row] 
      let detailLabelText = authorText[indexPath.row] 
      detailViewController.titleLabelText = topicLabelText 
      detailViewController.authorLabelText = detailLabelText 



     } 

    } 

} 

Hier sind die View-Controller, dass die Zelle den Song zu spielen geht:

import UIKit 
    import AVFoundation 
    import MediaPlayer 

    // audioPlayer Outlet 
    var libraryPlayer = AVAudioPlayer() 

    class LibraryDetailViewController: UITableViewController, AVAudioPlayerDelegate { 

     // Title and Author 
     var titleLabelText: String! 
     var authorLabelText: String! 
     @IBOutlet weak var albumArt: UIImageView! 
     @IBOutlet weak var titleText: UILabel! 
     // Image Outlets 
     @IBOutlet weak var authorText: UILabel! 
     @IBOutlet weak var blurredAlbumArt: UIImageView! 
     // Toolbar Outlets 
     @IBOutlet weak var toolbar: UIToolbar! 
     var playButton: UIBarButtonItem! 
     var pauseButton: UIBarButtonItem! 
     var flexibleSpace: UIBarButtonItem! 
     var nextButton: UIBarButtonItem! 
     var previousButton: UIBarButtonItem! 

     override func viewDidLoad() { 
      super.viewDidLoad() 
      // Customize Album Art 
      albumArt.image = UIImage(named: titleLabelText) 
      blurredAlbumArt.image = UIImage(named: titleLabelText) 
      albumArt.layer.cornerRadius = 10 
      // Set label text 
      titleText.text = titleLabelText 
      authorText.text = authorLabelText 


      // Create the audioPlayer 
      do { 

       libraryPlayer = try AVAudioPlayer(contentsOf: URL.init(fileURLWithPath: Bundle.main.path(forResource: titleLabelText, ofType: "mp3")!)) 
       libraryPlayer.delegate = self 


       libraryPlayer.prepareToPlay() 

       var audioSession = AVAudioSession.sharedInstance() 



       do { 

        try audioSession.setCategory(AVAudioSessionCategoryPlayback) 

       } 

      } 

      catch { 

       print(error) 

      } 

      // Create ToolBar Buttons 
      playButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.play, target: self, action: "playButtonTapped") 
      pauseButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.pause, target: self, action: "pauseButtonTapped") 
      flexibleSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: self, action: nil) 
      previousButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.rewind, target: self, action: "previousButtonTapped") 
      nextButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.fastForward, target: self, action: "nextButtonTapped") 

      // Customize ToolBar Buttons 
      previousButton.tintColor = UIColor.lightGray 
      nextButton.tintColor = UIColor.lightGray 

      toolbar.items = [flexibleSpace, previousButton, flexibleSpace, pauseButton, flexibleSpace, nextButton, flexibleSpace] 


      // Set the delegate 

      // Play 
      libraryPlayer.play() 



      // Do any additional setup after loading the view. 
     } 

     // Play 
     func playButtonTapped() { 
      toolbar.items = [flexibleSpace, previousButton, flexibleSpace, pauseButton, flexibleSpace, nextButton, flexibleSpace]; 
      libraryPlayer.play() 
     } 

     // Pause 
     func pauseButtonTapped() { 
      toolbar.items = [flexibleSpace, previousButton, flexibleSpace, playButton, flexibleSpace, nextButton, flexibleSpace]; 
      libraryPlayer.pause() 
     } 

     // Previous 
     func previousButtonTapped() { 
// NEED HELP HERE 
     } 

     // Next 
     func nextButtonTapped() { 
// NEED HELP HERE 
     } 

     override func viewDidDisappear(_ animated: Bool) { 
      libraryPlayer.pause() 
     } 

     override func viewDidAppear(_ animated: Bool) { 
      libraryPlayer.play() 
     } 

     override func didReceiveMemoryWarning() { 
      super.didReceiveMemoryWarning() 
      // Dispose of any resources that can be recreated. 
     } 


     @IBAction func dismiss(_ sender: Any) { 
      dismiss(animated: true, completion: nil) 
     } 
    } 

Vielen Dank für die Hilfe! Ich verwende Swift 3 und Xcode 8

+0

Sehen Sie diesen Beitrag https://Stackoverflow.com/a/14704753/4970453 –

+0

@VarinderSingh Ich habe Objective C nicht verloren. Haben Sie etwas in Swift? Vielen Dank! – iFunnyVlogger

Antwort

0

Sie Array Liederliste in Librarydetailviewcontroller und verwenden audioPlayerDidFinishPlaying Delegierte für den nächsten Song passieren kann ... sonst Sie playCurrentSong func auf "nextButtonTapped"

var currentSoundsIndex: Int = 0 

override func viewDidLoad() { 
super.viewDidLoad() 
currentSoundsIndex = 0 
playCurrentSong() 
} 

func playCurrentSong() { 
var error: Error? 
mediaPlayer = try? AVAudioPlayer(contentsOfURL: URL(fileURLWithPath: Bundle.main.path(forResource: soundList[currentSoundsIndex], ofType: nil))) 
if error != nil { 
    print("\(error)") 
    //Also possibly increment sound index and move on to next song 
} 
else { 
    lblCurrentSongName.text = soundList[currentSoundsIndex] 
    mediaPlayer.delegate = self 
    mediaPlayer.prepareToPlay() 
    //This is not always needed, but good to include 
    mediaPlayer.play() 
    } 
} 


func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { 
//Increment index but don't go out of bounds 
currentSoundsIndex = currentSoundsIndex += 1 % soundList.count 
playCurrentSong() 
} 
verwenden können
Verwandte Themen