ios - 初始化 AVAudioPlayer 以用于多个函数

标签 ios xcode swift3 avaudioplayer

通常的 AVAudioPlayer 在线教程在一个函数中创建一个 AVAudioPlayerAVAudioPlayer 对象的播放和停止函数不可用的地方直接来自其他函数的对象。问题是我想要另一个函数来停止 AVAudioPlayer 的声音。这看起来很简单,通过初始化类顶部的对象,希望它可以访问,但是在 Swift3 中,AVAudioPlayerinit 函数包括throw 和声音文件的参数。 Swift 不允许我们在属性初始值设定项中使用实例成员,所以我一直在思考如何编写它。

此时我遇到的唯一错误是在创建“backgroundMusicPlayer”时不允许在属性初始值设定项中使用实例成员:

import UIKit
import AVFoundation

class MadLibOneViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet weak var thePlace: UITextField!
    @IBOutlet weak var theVerb: UITextField!
    @IBOutlet weak var theNumber: UITextField!
    @IBOutlet weak var theTemplate: UITextView!
    @IBOutlet weak var theStory: UITextView!
    @IBOutlet weak var generateStoryButton: UIButton!
    @IBOutlet weak var proceedToNextMadLib: UIButton!
    //var backgroundMusicPlayer = AVAudioPlayer()

    var error:NSError?

    var path = Bundle.main.path(forResource: "bensound-cute", ofType: "mp3")

    var url: NSURL {
        return NSURL(fileURLWithPath: path!)
    }

    var backgroundMusicPlayer: AVAudioPlayer = try AVAudioPlayer(contentsOf: url as URL, error: &error)





    @IBAction func createStory(_ sender: AnyObject) {
        theStory.text=theTemplate.text
    theStory.text=theStory.text.replacingOccurrences(of: "<place>", with: thePlace.text!)
        theStory.text=theStory.text.replacingOccurrences(of: "<verb>", with: theVerb.text!)
        theStory.text=theStory.text.replacingOccurrences(of: "<number>", with: theNumber.text!)

        generateStoryButton.isHidden=true
        proceedToNextMadLib.isHidden=false

    }

    @IBAction func showNextStory(_ sender: AnyObject) {

        view.backgroundColor=UIColor.green

        let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
        let resultViewController = storyBoard.instantiateViewController(withIdentifier: "MadLibTwoViewController") as! MadLibTwoViewController
        self.present(resultViewController, animated:true, completion:nil)

    }

    @IBAction func hideKeyboard(_ sender: AnyObject) {
        thePlace.resignFirstResponder()
        theVerb.resignFirstResponder()
        theNumber.resignFirstResponder()
        theTemplate.resignFirstResponder()
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        proceedToNextMadLib.isHidden=true
        view.backgroundColor = UIColor.purple


        // Do any additional setup after loading the view.
        self.theVerb.delegate = self
        self.thePlace.delegate = self
        self.theNumber.delegate = self

    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        self.view.endEditing(true)
        return false
    }

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

}

最佳答案

您需要为此使用惰性初始化/实例化。在您的情况下,这就是您需要做的所有事情。

lazy var player: AVAudioPlayer = {
    [unowned self] in
    do {
        return try AVAudioPlayer.init(contentsOf: self.url)
    }
    catch {
        return AVAudioPlayer.init()
    }

}()

有关延迟初始化的更多信息 this是一本好书。在您的案例中,有趣的是初始化程序 throws。我想this forum discussion有一个小小的想法是有帮助的。

关于ios - 初始化 AVAudioPlayer 以用于多个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40536239/

相关文章:

iOS Webview 应用程序,如何在 Webview 中打开 JSON 解析推送通知?

XCode - 如何重置/"delete"从 XCode 运行的 mac os 应用程序(类似于在 ios 模拟器中删除应用程序)?

ios - 如何将 Swift 3.0 编译的 POD 应用到 2.2 的项目中?

ios - 如何隐藏不在末尾的空单元格 TableView ? swift 3

ios - NSPredicate for NSString中的问题

ios - 即使排列的 subview 被隐藏,UIStackView 似乎也会堆叠间距

ios - 如何在 swift 3 中访问我现有的 SQLite 数据库

ios - 使用 React Native 进行 UI 测试。如何修复时间戳事件匹配错误 : Failed to find matching element

cocoa - 将 Cocoa 添加到 Carbon 应用程序中?

ios - 根据用户选择更改应用本地化