我正在使用 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
}
出于某种原因,视频每次都会出现在第一个和第四个单元格中。我很好奇为什么。谢谢
最佳答案
您需要确保在重新使用单元格时移除播放器。
基本上,这意味着您的 if
需要一个 else
子句。可能是这样的 -
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
}
此外,您有很多 ?
,您可以在其中使用 !
。例如,cell
不会为 nil(如果是,那就很糟糕,应该抛出异常)并且转换为 VideoTableViewCell
或 String
或什至 PFFile
不应该失败,如果它失败了,那就是出了问题,异常可能是合适的,这样你就可以调试了。
关于ios - uitableviewcells 中的重复内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31665097/