uitableviewcells中的重复内容

时间:2015-07-27 23:33:17

标签: ios swift uitableview parse-platform

我正在使用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个单元格中。我很好奇为什么。感谢

2 个答案:

答案 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(如果是,则表示错误且应抛出异常)并且转换为cellVideoTableViewCell甚至{{1}不应该失败,如果确实出现了问题,那么异常可能是合适的,这样你就可以调试了。

答案 1 :(得分:0)

让我们这样想吧。当您开始加载屏幕时,您的currentActiveIndex为零是对的吗?那么当这个细胞加载时会发生什么?热潮 - 视频出现在那里。

当然,当你点击它并创建一个新的单元格时,你可以实际设置currentActiveIndex,这就是你得到这种行为的原因。这是你应该做的。

currentActiveIndex作为全局变量左右。当您选择一个新值时,只需执行一个self.tableview.reloadData()刷新整个UITableView或self.tableview.refreshSections("THE SECTION WITH THE VIDEOS")。将currentActiveIndex逻辑与UI部件分离。