我正在使用PFQueryTableViewController并尝试为Parse中的每个项目创建一个videoCell。我只想播放当前活动的单元格。
这是我的cellForRowAtIndexPath方法。
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath, object: PFObject?) -> PFTableViewCell? {
let cell: VideoTableViewCell? = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as? VideoTableViewCell
// cell?.parseObject = object
if let pfObject = object {
cell?.nameLabel?.text = pfObject["name"] as? String
print(pfObject["name"])
}
let file: PFFile? = object!.objectForKey("videoFile") as? PFFile
if self.currentActiveIndex == nil && file != nil {
self.currentActiveIndex = indexPath.row
print(file)
let fileUrl: NSURL? = NSURL(string: file!.url!)
let player: AVPlayer? = AVPlayer(URL: fileUrl!)
player?.addObserver(self, forKeyPath: "status", options: NSKeyValueObservingOptions.Initial, context: &PlayerStatusContext)
cell?.cellVideoView.setPlayer(player!)
cell?.cellVideoView.setVideoFillMode(AVLayerVideoGravityResizeAspectFill)
}
print(objects?.count)
return cell
}
出于某种原因,视频每次都出现在第1和第4个单元格中。我很好奇为什么。感谢
答案 0 :(得分:1)
您需要确保在重新使用单元格时移除播放器。
基本上,这意味着您需要else
的{{1}}条款。可能类似于 -
if
此外,您有很多override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath, object: PFObject?) -> PFTableViewCell? {
let cell: VideoTableViewCell? = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as? VideoTableViewCell
// cell?.parseObject = object
if let pfObject = object {
cell!.nameLabel!.text = pfObject["name"] as! String
print(pfObject["name"])
}
let file: PFFile? = object!.objectForKey("videoFile") as? PFFile
if self.currentActiveIndex == nil && file != nil {
self.currentActiveIndex = indexPath.row
print(file)
let fileUrl: NSURL? = NSURL(string: file!.url!)
let player: AVPlayer? = AVPlayer(URL: fileUrl!)
player?.addObserver(self, forKeyPath: "status", options: NSKeyValueObservingOptions.Initial, context: &PlayerStatusContext)
cell?.cellVideoView.setPlayer(player!)
cell?.cellVideoView.setVideoFillMode(AVLayerVideoGravityResizeAspectFill)
}
else {
if let player=cell!.cellVideoView.player {
player.removeObserver(self, forKeyPath:"status")
cell!.cellVideoView.setPlayer(nil)
}
}
print(objects?.count)
return cell
}
可以使用?
。例如,!
将不会为nil(如果是,则表示错误且应抛出异常)并且转换为cell
或VideoTableViewCell
甚至{{1}不应该失败,如果确实出现了问题,那么异常可能是合适的,这样你就可以调试了。
答案 1 :(得分:0)
让我们这样想吧。当您开始加载屏幕时,您的currentActiveIndex
为零是对的吗?那么当这个细胞加载时会发生什么?热潮 - 视频出现在那里。
当然,当你点击它并创建一个新的单元格时,你可以实际设置currentActiveIndex
,这就是你得到这种行为的原因。这是你应该做的。
将currentActiveIndex
作为全局变量左右。当您选择一个新值时,只需执行一个self.tableview.reloadData()
刷新整个UITableView或self.tableview.refreshSections("THE SECTION WITH THE VIDEOS")
。将currentActiveIndex
逻辑与UI部件分离。