私はこれを解決するためにどこでも検索しました。この質問を書いて私の運をもう一度試してみてください。私は名前とIDを含むXML URLデータを解析したcollectionViewCellを持っています。今すぐセルをタップすると、その中にAVPlayerを持つUIViewをロードします。ファイルを再生するには、別のURLを使用する必要がありますが、そのセルで解析したIDを使用する必要があります。ここにある私のdidSelectItem func
:私は私の項目NSObjectクラスからではなく、UIViewの負荷が細かいセルを選択した後の項目を設定していますが再生されないUICollectionVIewCellデータでUIViewを読み込めません
import UIKit
import AVFoundation
class PlayerView: UIView {
var item: Item?
override init(frame: CGRect) {
super.init(frame: frame)
backgroundColor = UIColor.black
let id = item?.itemId
if let url = URL(string: "http://xample.com/play.m3u?id=\(id)") {
let player = AVPlayer(url: url)
print(url)
let playerLayer = AVPlayerLayer(player: player)
self.layer.addSublayer(playerLayer)
playerLayer.frame = self.frame
player.play()
}
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
class PlayerLauncher: NSObject {
func showPlayer() {
if let keyWindow = UIApplication.shared.keyWindow {
let view = UIView(frame: keyWindow.frame)
view.backgroundColor = UIColor.white
view.frame = CGRect(x: 0, y: keyWindow.frame.height - 50, width: view.frame.width, height: 50)
let playerFrame = CGRect(x: 0, y: 0, width: keyWindow.frame.width, height: keyWindow.frame.height)
let playerView = PlayerView(frame: playerFrame)
view.addSubview(playerView)
keyWindow.addSubview(view)
UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: {
view.frame = keyWindow.frame
}, completion: nil)
}
}
}
:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let playerLauncher = PlayerLauncher()
playerLauncher.showPlayer()
}
は、これは私のPlayerLauncherファイルですファイルはid = nil
です。どうすれば修正できますか?
更新:私のコードを少し変更しました。私はIDを印刷することができます。私はPlayerViewとPlayerLauncherクラスにいくつかのコードを変更し、この後
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
collectionView.deselectItem(at: indexPath, animated: true)
let playerView = PlayerView()
playerView.item = items?[indexPath.item]
let playerLauncher = PlayerLauncher()
playerLauncher.showPlayer()
}
:
ここで私はdidSelectItem
方法で行った変更がある
import UIKit
import AVFoundation
class PlayerView: UIView {
var id: String?
var item: Item? {
didSet {
id = item?.itemId
print(id)
}
}
override init(frame: CGRect) {
super.init(frame: frame)
backgroundColor = UIColor.black
}
func startPlaying() {
if let url = URL(string: "http://xample.com/play.m3u?id=\(id)") {
let player = AVPlayer(url: url)
print(url)
let playerLayer = AVPlayerLayer(player: player)
self.layer.addSublayer(playerLayer)
playerLayer.frame = self.frame
player.play()
}
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
class PlayerLauncher: NSObject {
func showPlayer() {
if let keyWindow = UIApplication.shared.keyWindow {
let view = UIView(frame: keyWindow.frame)
view.backgroundColor = UIColor.white
view.frame = CGRect(x: 0, y: keyWindow.frame.height - 50, width: view.frame.width, height: 50)
let playerFrame = CGRect(x: 0, y: 0, width: keyWindow.frame.width, height: keyWindow.frame.height)
let playerView = PlayerView(frame: playerFrame)
view.addSubview(playerView)
keyWindow.addSubview(view)
UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: {
view.frame = keyWindow.frame
}, completion: { (completeAnimation) in
playerView.startPlaying()
})
}
}
}
は、今私はdidSet
からIDを印刷することができますが、 startPlaying()
メソッドでは、それを選択するとまだid = nil
と表示されます。 didSet
のプロパティをinit
またはstartPlaying()
funcに設定するにはどうすればよいですか?
ありがとうございます。どうすればインスタンスを作成できますか教えてください。 – Mohit