2016-07-24 4 views
1

Ich brauche dringend Hilfe, da mein Kopf wirklich wund ist, weil ich ihn gegen die Wand geschlagen habe.Kann aufgenommene Dateien nicht zu einem TableView auflisten

Ich habe einen View-Controller, in dem ich Audio mit meinem Mikrofon aufnehme und es im Dokumentenverzeichnis von Apps abspeichere. Das funktioniert gut und ich kann die Dateien sehen, wenn ich zu diesem Ordner im Simulator navigiere.

Mein Problem ist, dass ich eine TableView mit einem eigenen TableViewController habe, wo ich den Inhalt des Dokumentenverzeichnisses auflisten möchte, das meine Aufzeichnungen enthält. Ich habe das TableView erstellt und es liest und füllt die Tabelle basierend auf einem Basis-Array. Mein Problem ist, dass ich es nicht konvertieren kann, um stattdessen den Inhalt des Dokumentenverzeichnisses zu lesen.

Ich habe zukünftige Ziele für diese Tabelle, damit ich auch die Datei innerhalb dieser TableView wiedergeben, löschen oder umbenennen kann, indem ich die bestimmte Zelle wische.

Ich habe an diesem Thema seit etwa 5 Tagen gearbeitet und ich bin sicher, dass ich etwas sehr einfaches zu euch allen übersehe.

ich Xcode bin mit 7.3.1 mit Swift 2.

Vielen Dank im Voraus und ich kann nicht warten, bis ich zu einem Punkt, wo ich beitragen kann.

ViewControllerRecorder.swift (Dies ist, wo ich die Audio-Dokumentverzeichnis aufnehmen und speichern, die funktioniert.)

import UIKit 
import AVFoundation 
import PermissionScope 

class ViewControllerRecorder: UIViewController, AVAudioRecorderDelegate, AVAudioPlayerDelegate { 

    @IBOutlet weak var stopButton: UIButton! 
    @IBOutlet weak var recordButton: UIButton! 
    @IBOutlet weak var playButton: UIButton! 

    @IBOutlet weak var audioDuration: UISlider! 


    var audioRecorder:AVAudioRecorder? 
    var audioPlayer:AVAudioPlayer? 

    let pscope = PermissionScope() 


    override func viewDidLoad() { 
     super.viewDidLoad() 

     audioDuration.value = 0.0 

     // Set up permissions 
     pscope.addPermission(MicrophonePermission(), 
          message: "Inorder to use this app, you need to grant the microphone permission") 

     // Show dialog with callbacks 
     pscope.show({ finished, results in 
      print("got results \(results)") 
      }, cancelled: { (results) -> Void in 
       print("thing was cancelled") 
     }) 

     // Disable Stop/Play button when application launches 
     stopButton.enabled = false 
     playButton.enabled = false 




     // Get the document directory. If fails, just skip the rest of the code 
     guard let directoryURL = NSFileManager.defaultManager().URLsForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask).first else { 

      let alertMessage = UIAlertController(title: "Error", message: "Failed to get the document directory for recording the audio. Please try again later.", preferredStyle: .Alert) 
      alertMessage.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil)) 
      presentViewController(alertMessage, animated: true, completion: nil) 

      return 
     } 

     // Set the default audio file 
     let audioFileURL = directoryURL.URLByAppendingPathComponent("PWAC_" + NSUUID().UUIDString + ".m4a") 

     // Setup audio session 
     let audioSession = AVAudioSession.sharedInstance() 

     do { 
      try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions: AVAudioSessionCategoryOptions.DefaultToSpeaker) 




      // Define the recorder setting 
      let recorderSetting: [String: AnyObject] = [ 
       AVFormatIDKey: Int(kAudioFormatMPEG4AAC), 
       AVSampleRateKey: 32000.0, 
       AVNumberOfChannelsKey: 2, 
       AVEncoderAudioQualityKey: AVAudioQuality.Medium.rawValue 
      ] 

      // Initiate and prepare the recorder 
      audioRecorder = try AVAudioRecorder(URL: audioFileURL, settings: recorderSetting) 
      audioRecorder?.delegate = self 
      audioRecorder?.meteringEnabled = true 
      audioRecorder?.prepareToRecord() 

     } catch { 
      print(error) 
     } 

    } 


    func updateaudioDuration(){ 

     audioDuration.value = Float(audioPlayer!.currentTime) 
    } 

    @IBAction func sliderAction(sender: AnyObject) { 


     audioPlayer!.currentTime = NSTimeInterval(audioDuration.value) 

    } 

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

    @IBAction func play(sender: AnyObject) { 
     if let recorder = audioRecorder { 
      if !recorder.recording { 
       do { 
        audioPlayer = try AVAudioPlayer(contentsOfURL: recorder.url) 

        audioDuration.maximumValue = Float(audioPlayer!.duration) 
        _ = NSTimer.scheduledTimerWithTimeInterval(0.05, target: self, selector: #selector(ViewControllerRecorder.updateaudioDuration), userInfo: nil, repeats: true) 

        audioPlayer?.delegate = self 
        audioPlayer?.play() 
        playButton.setImage(UIImage(named: "playing"), forState: UIControlState.Selected) 
        playButton.selected = true 
       } catch { 
        print(error) 
       } 
      } 
     } 
    } 

    @IBAction func stop(sender: AnyObject) { 
     recordButton.setImage(UIImage(named: "record"), forState: UIControlState.Normal) 
     recordButton.selected = false 
     playButton.setImage(UIImage(named: "play"), forState: UIControlState.Normal) 
     playButton.selected = false 

     stopButton.enabled = false 
     playButton.enabled = true 

     audioRecorder?.stop() 

     let audioSession = AVAudioSession.sharedInstance() 

     do { 
      try audioSession.setActive(false) 
     } catch { 
      print(error) 
     } 
    } 

    @IBAction func record(sender: AnyObject) { 
     // Stop the audio player before recording 
     if let player = audioPlayer { 
      if player.playing { 
       player.stop() 
       playButton.setImage(UIImage(named: "play"), forState: UIControlState.Normal) 
       playButton.selected = false 
      } 
     } 

     if let recorder = audioRecorder { 
      if !recorder.recording { 
       let audioSession = AVAudioSession.sharedInstance() 

       do { 
        try audioSession.setActive(true) 

        // Start recording 
        recorder.record() 
        recordButton.setImage(UIImage(named: "recording"), forState: UIControlState.Selected) 
        recordButton.selected = true 


       } catch { 
        print(error) 
       } 

      } else { 
       // Pause recording 
       recorder.pause() 
       recordButton.setImage(UIImage(named: "pause"), forState: UIControlState.Normal) 
       recordButton.selected = false 
      } 
     } 

     stopButton.enabled = true 
     playButton.enabled = false 

    } 


    // MARK: - AVAudioRecorderDelegate Methods 
    func audioRecorderDidFinishRecording(recorder: AVAudioRecorder, successfully flag: Bool) { 
     if flag { 

      // iOS8 and later 
      let alert = UIAlertController(title: "Recorder", 
              message: "Finished Recording", 
              preferredStyle: .Alert) 
      alert.addAction(UIAlertAction(title: "Keep", style: .Default, handler: {action in 
       print("keep was tapped") 
      })) 
      alert.addAction(UIAlertAction(title: "Delete", style: .Default, handler: {action in 
       print("delete was tapped") 
       self.audioRecorder!.deleteRecording() 
      })) 

      self.presentViewController(alert, animated:true, completion:nil) 

//   let alertMessage = UIAlertController(title: "Finish Recording", message: "Successfully recorded the audio!", preferredStyle: .Alert) 
//   alertMessage.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil)) 
//   presentViewController(alertMessage, animated: true, completion: nil) 
      print("Audio has finished recording") 
      print(recorder.url) 
     } 
    } 

    // MARK: - AVAudioPlayerDelegate Methods 
    func audioPlayerDidFinishPlaying(player: AVAudioPlayer, successfully flag: Bool) { 
     playButton.setImage(UIImage(named: "play"), forState: UIControlState.Normal) 
     playButton.selected = false 

     let alertMessage = UIAlertController(title: "Finish Playing", message: "Finish playing the recording!", preferredStyle: .Alert) 
     alertMessage.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil)) 
     presentViewController(alertMessage, animated: true, completion: nil) 
     print("Audio has finished playing") 
     print(player.url) 
    } 


} 

ViewControllerFileManager.swift (Dies ist die View Controller, der den Inhalt des Dokumentverzeichnisses zu einem TableView anzeigen soll.)

AKTUALISIERT 2016/07/27

import UIKit 

class ViewControllerFileManager: UIViewController, UITableViewDataSource, UITableViewDelegate { 

var arrayRecordings = [String]() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let fileManager = NSFileManager.defaultManager() 
    let dirPath = NSBundle.mainBundle().resourcePath! 


    let items = try! fileManager.contentsOfDirectoryAtPath(dirPath) 

    for item in items { 
     if item.hasSuffix("m4a") { 

      arrayRecordings.append(item) 

     } 
     print("Found \(item)") 
    } 



    // Do any additional setup after loading the view, typically from a nib. 
} 

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


func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    // Return the number of rows in the section. 
    return arrayRecordings.count 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cellIdentifier = "Cell" 
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) 



    // Configure the cell... 


    cell.textLabel?.text = arrayRecordings[indexPath.row] 
    return cell 
} 

override func prefersStatusBarHidden() -> Bool { 
    return true 
} 

} 
+0

Hallo zu füllen und es funktioniert! Haben Sie schon diesen Thread überprüft: http://stackoverflow.com/questions/8376511/list-saved-files-ini-ios-documents-directory-in-a-uitableview? – fiks

+0

Hallo fiks, das war tatsächlich einer der Threads, die ich ausprobiert habe. Ich konnte es anscheinend nicht funktionieren lassen, obwohl ich dachte, dass das meine Antwort zu sein schien. Ich bin sicher, dass ich den Code an den falschen Stellen eingefügt habe. Könnten Sie mir, basierend auf meinem "ViewControllerFileManager", möglicherweise zu einer korrekten Implementierung führen? – Bill

+1

Ich würde laden die Dateien in der ViewDidLoad. Hast du das versucht? Wenn ja, und es hat nicht funktioniert, kann ich dann etwas Zeit investieren, um etwas basierend auf Ihrem Code zu implementieren. – fiks

Antwort

0

Hier ist der Code, dass ich eine Tableview mit dem Inhalt meiner apps Dokumentordner

import UIKit 

class ViewControllerFileManager: UIViewController, UITableViewDataSource, UITableViewDelegate { 



    var arrayRecordings = [String]() 



    override func viewDidLoad() { 
     super.viewDidLoad() 

     // MARK: Read Document Directory and populate Array 

     // Get the document directory url: 
     let documentsUrl = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first! 

     do { 
      // Get the directory contents urls (including subfolders urls): 
      let directoryContents = try NSFileManager.defaultManager().contentsOfDirectoryAtURL(documentsUrl, includingPropertiesForKeys: nil, options: []) 
      print(directoryContents) 

      // Filter directory contents: 
      let audioFiles = directoryContents.filter{ $0.pathExtension == "m4a" } 
      print("m4a urls:",audioFiles) 

      // Get the File Names: 
      let audioFileNames = audioFiles.flatMap({$0.URLByDeletingPathExtension?.lastPathComponent}) 
      print("m4a list:", audioFileNames) 

      for audioFileName in audioFileNames { 
       arrayRecordings.append(audioFileName) 
       print("Found \(audioFileName)") 
      } 


     } catch let error as NSError { 
      print(error.localizedDescription) 
     } 

    } 


    // MARK: TableView Functions 
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     // Return the number of rows in the section. 
     return arrayRecordings.count 
    } 



    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

     let cellIdentifier = "Cell" 
     let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) 


     // Configure the cell... 
     cell.textLabel?.text = arrayRecordings[indexPath.row] 
     return cell 
    } 


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



    override func prefersStatusBarHidden() -> Bool { 
     return true 
    } 


} 
0

Wenn Sie das Array in viewDidLoad bevölkern, müssen Sie reload von Tableview nennen es auffrischen zu.

override func viewDidLoad() 
{ 
    super.viewDidLoad() 

    // populate recordingFileNames here 

    // refresh your table 
    reloadTableViewContent() 
} 

func reloadTableViewContent() 
{ 
    dispatch_async(dispatch_get_main_queue(), {() -> Void in 
     self.tableView.reloadData() 
     self.tableView.scrollRectToVisible(CGRectMake(0, 0, 1, 1), animated: false) 
    }) 
}