2015-04-27 17 views
18

Ses kaydına/oynatmaya işleyen ve bu sınıfa bir Protocol koyan özel bir sınıf yaptım. UIViewController sınıfında Protocol'u uyguladı ve AudioHelper sınıfım için setDelegate yöntemimi çağırdım.Swift: super.init ifadesinden önce yöntem çağrısında 'self' kullanımı kendi kendine derleme hatasını başlatır

init() ile ilgili bir derleme hatası alıyorum. Tam olarak emin nasıl hata kurtulmak için:

use of 'self' in method call 'setupAudioSession' before super.init initializes self

override init() { 
     setupAudioSession() 
     super.init() 
    } 

Nasıl bu hatayı gidermek? Ve neden init() 'i geçersiz kılmalıyım?

Benim AudioHelper sınıf

import Foundation 
import AVFoundation 

class AudioHelper: NSObject, AVAudioRecorderDelegate { 

    var audioSession: AVAudioSession? 
    var audioRecorder: AVAudioRecorder? 
    var delegate: AudioRecorderProtocol? 

    class var sharedInstance: AudioHelper { 

     struct Static { 
      static var instance: AudioHelper? 
      static var token: dispatch_once_t = 0 
     } 

     dispatch_once(&Static.token) { 
      Static.instance = AudioHelper() 
     } 

     return Static.instance! 
    } 

    override init() { 
     setupAudioSession() 
     super.init() 
    } 

    func setDelegate(delegate: AudioRecorderProtocol) { 
     self.delegate = delegate 
    } 

    func setupAudioSession() { 
     audioSession = AVAudioSession.sharedInstance() 
     audioSession?.setCategory(AVAudioSessionCategoryPlayAndRecord, error: nil) 
     audioSession?.setActive(true, error: nil) 
    } 

    func createAudioMessageDirectory() { 
     let fm = NSFileManager.defaultManager() 
     if !fm.fileExistsAtPath(GlobalVars.kAudioMessageDirectory) { 
      var error: NSError? 
      if !fm.createDirectoryAtPath(GlobalVars.kAudioMessageDirectory, withIntermediateDirectories: true, attributes: nil, error: &error) { 
       println("Unable to create audio message directory: \(error)") 
      } 
     } 
    } 

    // MARK: Recording 

    func beginRecordingAudio() { 
     createAudioMessageDirectory() 
     var filepath = GlobalVars.kAudioMessageDirectory.stringByAppendingPathComponent("audiofile.aac") 
     var url = NSURL(fileURLWithPath: filepath) 

     var recordSettings = [ 
      AVFormatIDKey: kAudioFormatMPEG4AAC, 
      AVSampleRateKey: 8000.0, 
      AVNumberOfChannelsKey: 1, 
      AVEncoderBitRateKey: 12800, 
      AVLinearPCMBitDepthKey: 16, 
      AVEncoderAudioQualityKey: AVAudioQuality.Max.rawValue 
     ] 

     println("Recorded Audio Message Saved: \(url!)") 

     var error: NSError? 
     audioRecorder = AVAudioRecorder(URL: url, settings: recordSettings as [NSObject : AnyObject], error: &error) 

     if error == nil { 
      if audioRecorder != nil { 
       audioRecorder!.delegate = self 
       audioRecorder!.record() 
      } 
     } 
     else { 
      println(error!.localizedDescription) 
     } 
    } 

    func stopRecordingAudio() { 
     if audioRecorder != nil { 
      audioRecorder!.stop() 
     } 
    } 

    func handleRecordAudioButtonLongPressGestureForState(state: UIGestureRecognizerState) { 
     if state == UIGestureRecognizerState.Ended { 
      stopRecordingAudio() 
      delegate?.onRecordAudioStop() 
     } 
     else if state == UIGestureRecognizerState.Began { 
      beginRecordingAudio() 
      delegate?.onRecordAudioStop() 
     } 
    } 

    func audioRecorderDidFinishRecording(recorder: AVAudioRecorder!, successfully flag: Bool) { 
     println("Record Audio Success: \(flag)") 
     delegate?.onRecordAudioFinished() 
    } 

    func audioRecorderEncodeErrorDidOccur(recorder: AVAudioRecorder!, error: NSError!) { 
     println("Record Audio Encode Error: \(error.localizedDescription)") 
    } 

    // MARK: Playback 

    func playAudioMessageFromUrl(messageId: String) { 
     if let url = NSURL(string: GlobalVars.kUrlAudioMessage + messageId) { 
      if let data = NSData(contentsOfURL: url) { 
       var error: NSError? = nil 
       let audioPlayer = AVAudioPlayer(data: data, error: &error) 

       if error == nil { 
        if audioPlayer != nil { 
         audioPlayer.numberOfLoops = 0 
         audioPlayer.volume = 1.0 
         audioPlayer.prepareToPlay() 
         audioPlayer.play() 
        } 
       } 
       else { 
        println("Audio playback error: \(error?.localizedDescription)") 
       } 
      } 
     } 
    } 

} 

protocol AudioRecorderProtocol { 
    func onRecordAudioStart() 
    func onRecordAudioStop() 
    func onRecordAudioFinished() 
} 
protokolünü uygulayan

Benim UIViewController

class ChatViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, AudioRecorderProtocol { 

    let audioHelper = AudioHelper.sharedInstance 

    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 

    override func viewDidLoad() { 
     super.viewDidLoad() 

//  addDemoMessages() 

     setupGestureRecognizer() 
     setupKeyboardObserver() 
     setupViews() 
     setupTableView() 
     audioHelper.setDelegate(self) 
    } 

    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 
     getUsersFromDb() 
     getMessagesFromDb() 
    } 

    override func viewDidAppear(animated: Bool) { 
     super.viewDidAppear(animated) 
     setCurrentVC() 
     tableView.reloadData() 

     if partnerUserId != nil && !db.doesUserExist(partnerUserId!) { 
      HttpPostHelper.profileGet(userId: partnerUserId!) 
     } 

     requestMessagesFromServer() 
    } 

    override func viewDidLayoutSubviews() { 
     super.viewDidLayoutSubviews() 
     ViewHelper.scrollTableViewToBottom(tableView) 
    } 

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

    func handleRecordAudioButtonHold(sender: UILongPressGestureRecognizer) { 
     audioHelper.handleRecordAudioButtonLongPressGestureForState(sender.state) 
    } 

    func onRecordAudioStart() { 
     dispatch_async(dispatch_get_main_queue(), { 
      ViewHelper.showToast(NSLocalizedString("RECORDING", comment: "")) 
      self.recordAudioButton.imageView!.image = UIImage(named: "RecordAudioClicked") 
     }) 
    } 

    func onRecordAudioStop() { 
     dispatch_async(dispatch_get_main_queue(), { 
      self.recordAudioButton.imageView!.image = UIImage(named: "RecordAudio") 
     }) 
    } 

    func onRecordAudioFinished() { 
     HttpPostHelper.messageAudio(partnerUserId: partnerUserId) 
    } 

    func playAudioFromUrl(sender: UIButton) { 
     let messageId = messages[sender.tag].id 
     audioHelper.playAudioMessageFromUrl(messageId) 
    } 

} 

cevap

34

Sadece

) (super.init altına yerleştirin (dışsal kodu kesip) Nesnenin ilk önce süper sınıf tarafından başlatılması gerekiyor ve sonra bunu yapabilirsiniz r özel başlatma.

Yani şöyle:

override init() { 
    super.init() 
    setupAudioSession() 
} 
+0

Doh! Bu işe yaradı! Yemin ederim bunu daha önce denedim, ama değil mi? Teşekkürler! –

+0

Yardım ettiğime sevindim. Eğer sizin için çalışmışsa cevap olarak işaretlemekte özgürsünüz :) –

+0

Yapacak! 6 dakika içinde kabul edebilir =] –

İlgili konular