【问题标题】:Call a method from another UIViewController in swift 2.0在 swift 2.0 中从另一个 UIViewController 调用方法
【发布时间】:2015-10-10 09:48:54
【问题描述】:

我有一个播放歌曲的应用程序,我有一个外部类,它有一个 playSound 函数和所有需要的变量:

class Song: NSObject {

    var audioPlayer: AVAudioPlayer!
    var deviceCurrentTime: NSTimeInterval!

    func playSong() {

        let sound = NSBundle.mainBundle().pathForResource("song", ofType: "mp3")
        let soundData = NSData(contentsOfFile: sound!)
        //  self.audioPlayer = AVAudioPlayer(data: soundData!) throws

        self.audioPlayer = nil
        do {
            self.audioPlayer = try AVAudioPlayer(data: soundData!)
        }
        catch {
            print("Handle \(error) here")
        }

        let delay:NSTimeInterval = 0.0//100ms
        var playtime:NSTimeInterval
        playtime = audioPlayer.deviceCurrentTime + delay

        self.audioPlayer?.playAtTime(playtime)
        self.audioPlayer?.play()


    }

然后在我的 mainViewController 的 ViewDidLoad 中,我想播放歌曲并从我的 Song 对象中访问方法:

    super.viewDidLoad()

    let vc: NSObject = Song()
    if let myVc = vc as? Song {
        myVc.playSong()
    }

但这不会播放歌曲...如果我也使用 playSong 方法将 Song 中的所有变量放入 mainViewControler 并在 viewDidLoad 中说 playSong(),它可以工作,但我想将它放在外部类中。

有什么帮助吗? :)

【问题讨论】:

标签: ios iphone swift


【解决方案1】:

您可以创建一个全局方法。创建一个空的 swift 文件并在其中添加以下代码:

import Foundation
import AVFoundation


var backgroundMusicPlayer = AVAudioPlayer()

func playBackgroundMusic(filename: String) {
    let url = NSBundle.mainBundle().URLForResource(filename, withExtension: nil)
    guard let newURL = url else {
        print("Could not find file: \(filename)")
        return
    }
    do {
        backgroundMusicPlayer = try AVAudioPlayer(contentsOfURL: newURL)
        backgroundMusicPlayer.numberOfLoops = -1
        backgroundMusicPlayer.prepareToPlay()
        backgroundMusicPlayer.play()
    } catch let error as NSError {
        print(error.description)
    }
}

现在,当您想播放任何歌曲时,只需以这种方式调用该方法:

playBackgroundMusic("yourSong.mp3")

如果你想和你的班级一起去,那么你可以这样做:

import Foundation
import AVFoundation

var audioPlayer: AVAudioPlayer!
var deviceCurrentTime: NSTimeInterval!

class Song: NSObject {

    func playSong() {

        let sound = NSBundle.mainBundle().pathForResource("We_Are_One_Ole_Ola_", ofType: "mp3")
        let soundData = NSData(contentsOfFile: sound!)
        //  self.audioPlayer = AVAudioPlayer(data: soundData!) throws

        audioPlayer = nil
        do {
            audioPlayer = try AVAudioPlayer(data: soundData!)
        }
        catch {
            print("Handle \(error) here")
        }

        let delay:NSTimeInterval = 0.0//100ms
        var playtime:NSTimeInterval
        playtime = audioPlayer.deviceCurrentTime + delay

        audioPlayer?.playAtTime(playtime)
        audioPlayer?.play()

    }
}

在其他类中你可以这样使用:

override func viewDidLoad() {
    super.viewDidLoad()

    let temp = Song()
    temp.playSong()
}

【讨论】:

  • 感谢它现在有效! :) 所以唯一的区别是把变量从类 Song: NSObject {}? (在“进口”下)
  • 是的。你必须让它全球化.. :)
  • 非常感谢您的帮助 ;)
  • 很高兴为您提供帮助.. :)
  • 你好。 @DharmeshKheni。我正在尝试将您的答案应用于我的问题,但它不起作用。几天来我一直在尝试各种初始化方法。请你看一下。谢谢你。 stackoverflow.com/questions/38711226/…
猜你喜欢
  • 2014-08-10
  • 1970-01-01
  • 2023-04-09
  • 2015-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多