Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在不同的视图控制器中具有相同的视频实例?_Ios_Iphone_Swift_Swift3 - Fatal编程技术网

Ios 如何在不同的视图控制器中具有相同的视频实例?

Ios 如何在不同的视图控制器中具有相同的视频实例?,ios,iphone,swift,swift3,Ios,Iphone,Swift,Swift3,我想在我的应用程序的背景中有一个视频,但是我已经通过让我的所有类继承这个类来实现了这一点 class MyClass: UIViewController { var avPlayer: AVPlayer! var avPlayerLayer: AVPlayerLayer! var paused: Bool = false override func viewDidLoad() { super.viewDidLoad() let theURL = Bundle.main.url

我想在我的应用程序的背景中有一个视频,但是我已经通过让我的所有类继承这个类来实现了这一点

class MyClass: UIViewController {

var avPlayer: AVPlayer!
var avPlayerLayer: AVPlayerLayer!
var paused: Bool = false

override func viewDidLoad() {
    super.viewDidLoad()
    let theURL = Bundle.main.url(forResource:"video", withExtension: "mp4")

    avPlayer = AVPlayer(url: theURL!)
    avPlayerLayer = AVPlayerLayer(player: avPlayer)
    avPlayerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
    avPlayer.volume = 0
    avPlayer.actionAtItemEnd = .none

    avPlayerLayer.frame = view.layer.bounds
    view.backgroundColor = .clear
    view.layer.insertSublayer(avPlayerLayer, at: 0)

    NotificationCenter.default.addObserver(self,
                                           selector: #selector(playerItemDidReachEnd(notification:)),
                                           name: NSNotification.Name.AVPlayerItemDidPlayToEndTime,
                                           object: avPlayer.currentItem)
}

func playerItemDidReachEnd(notification: Notification) {
    let p: AVPlayerItem = notification.object as! AVPlayerItem
    p.seek(to: kCMTimeZero)
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    avPlayer.play()
    paused = false
}

override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)
    avPlayer.pause()
    paused = true
}

问题是,当我从视图控制器更改时,视频会重新开始,我不希望这样,我希望视频从上一个视图控制器中继续,我的解决方案是实例化一个视频,并在所有视图控制器上访问它。我怎么能做到这一点?或者还有其他解决方案吗?

您可以使用Singleton实现这一点

下面是一个例子:

final class VideoPlayerManager {
    static let shared = VideoPlayerManager()
    private init() { }

    var avPlayer: AVPlayer!
    var avPlayerLayer: AVPlayerLayer!
    var paused: Bool = false
}
要调用viewDidLoad,请执行以下操作:


您可以使用Singleton实现这一点

下面是一个例子:

final class VideoPlayerManager {
    static let shared = VideoPlayerManager()
    private init() { }

    var avPlayer: AVPlayer!
    var avPlayerLayer: AVPlayerLayer!
    var paused: Bool = false
}
要调用viewDidLoad,请执行以下操作:

创建如下单例:-

class A {
static let a = A()
}
您可以在同一类的多个类中访问上述对象 实例

创建如下单例:-

class A {
static let a = A()
}
您可以在同一类的多个类中访问上述对象 实例


背景很重要。例如,如果在导航控制器中嵌入了视图控制器,则将视频播放器放在导航控制器中,并在顶部添加清晰的背景色视图控制器会更有意义。通过这种方式,您可以保留一个实例,并且您的视频播放器也可以独立于topViewController,这是一个这样的选项。上下文非常重要。例如,如果在导航控制器中嵌入了视图控制器,则将视频播放器放在导航控制器中,并在顶部添加清晰的背景色视图控制器会更有意义。这样,您就保留了一个实例,并且您的视频播放器再次独立于topViewController,这是一个这样的选项。