2017-11-23 7 views
0

Ich möchte einige Songs aus einem Ordner abspielen, den ich zu xcode hinzugefügt habe.swift: Index außerhalb des Bereichs

Ich benutze Tabbed Anwendung und der Code wie folgt aus:

func playThis(thisOne:String) 
{ 
    do 
    { 
     let audioPath = Bundle.main.path(forResource: thisOne, ofType: ".mp3") 
     try audioPlayer = AVAudioPlayer(contentsOf: NSURL(fileURLWithPath: audioPath!) as URL) 
     audioPlayer.play() 
    } 
    catch 
    { 
     print ("ERROR") 
    } 
} 

override func viewDidLoad() { 

    super.viewDidLoad() 
    label.text = songs[thisSong] //error index out of range 
} 

Aber wenn ich es laufen, erscheint das Lied nicht in erster View-Controller und wenn ich auf die zweite View-Controller-Registerkarte App stürzt ab und der Grund ist:

Index außerhalb des zulässigen Bereichs

Erste-View-Controller-Code ist wie folgt aus:

import UIKit 
import AVFoundation 

var audioPlayer = AVAudioPlayer() 
var songs:[String] = [] 
var thisSong = 0 
var audioStuffed = false 

class FirstViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

@IBOutlet weak var myTableView: UITableView! 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
{ 
    return songs.count 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
{ 
    let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "cell") 
    cell.textLabel?.text = songs[indexPath.row] 
    return cell 
} 

und meine Art und Weise, den Song zum Detail View-Controller zu übergeben:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
{ 
    do 
    { 
     let audioPath = Bundle.main.path(forResource: songs[indexPath.row], ofType: ".mp3") 
     try audioPlayer = AVAudioPlayer(contentsOf: NSURL(fileURLWithPath: audioPath!) as URL) 
     audioPlayer.play() 
     thisSong = indexPath.row 
     audioStuffed = true 
    } 
    catch 
    { 
     print ("ERROR") 
    } 
} 

zweiten View-Controller-Code:

override func viewDidLoad() 
{ 
    super.viewDidLoad() 
    gettingSongNames() 
} 


override func didReceiveMemoryWarning() 
{ 
    super.didReceiveMemoryWarning() 
} 


//FUNCTION THAT GETS THE NAME OF THE SONGS 
func gettingSongNames() 
{ 
    let folderURL = URL(fileURLWithPath:Bundle.main.resourcePath!) 

    do 
    { 
     let songPath = try FileManager.default.contentsOfDirectory(at: folderURL, includingPropertiesForKeys: nil, options: .skipsHiddenFiles) 

     //loop through the found urls 
     for song in songPath 
     { 
      var mySong = song.absoluteString 

      if mySong.contains(".mp3") 
      { 
       let findString = mySong.components(separatedBy: "/") 
       mySong = findString[findString.count-1] 
       mySong = mySong.replacingOccurrences(of: "%20", with: " ") 
       mySong = mySong.replacingOccurrences(of: ".mp3", with: "") 
       songs.append(mySong) 
      } 

     } 

     myTableView.reloadData() 
    } 
    catch 
    { 
     print ("ERROR") 
    } 
} 
+0

Wo definiert ist 'Liede'? Wo ist es bevölkert? Wo ist 'ThisSong' definiert, was es wert ist? – Larme

+0

das ist von der ersten Ansicht Controller, ich war ändern .. sehen Sie mehr –

+0

Wie übergeben Sie den Song-Index und Lieder zum Detail View-Controller? –

Antwort

0

Nicht genügend Bedingungen aus dem bereitgestellten Code erhalten b ut Wenn Sie den Absturz stoppen wollen, behandeln Sie die Ausnahmen und behandeln Sie jedes Szenario des Codes. Beispiel: Überprüfen Sie immer den array.count> 0, bevor Sie auf die Werte zugreifen. In Ihrem Fall:

if songs.count > 0 { label.text = songs[thisSong] }

+0

, wo ich diesen Code? –

+0

Inside viewdidload –

+0

ich war es eingegeben, aber wenn ich laufe ... liste des liedes ist nicht angezeigt und im detail view controller wenn ich klicke play dort nichts ändert was ... –

Verwandte Themen