ios - uitableviewcells 中的重复内容

标签 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
}

出于某种原因,视频每次都会出现在第一个和第四个单元格中。我很好奇为什么。谢谢

最佳答案

您需要确保在重新使用单元格时移除播放器。

基本上,这意味着您的 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(如果是,那就很糟糕,应该抛出异常)并且转换为 VideoTableViewCellString 或什至 PFFile 不应该失败,如果它失败了,那就是出了问题,异常可能是合适的,这样你就可以调试了。

关于ios - uitableviewcells 中的重复内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31665097/

相关文章:

ios - SimplePCMRecorder 中的 AudioQueueBufferRef 在 swift 3 中显示错误

swift - 如何测试没有数据写入 NSPipe

ios - 初始化器不会覆盖其父类(super class)中的指定初始化器

swift - Swift实现通用功能

ios - 是否可以使用 UIPageControl 来控制 UITableView 的移动?

ios - 滚动表格 View 后点击选择行时如何修复崩溃?

iphone - Xcode项目管理: adding a iPad (Storyboards, iOS 5)到兼容iOS 4的iPhone项目

ios - 如何通过 UITableViewRowAction swift 使用 inputview

ios - 使用 scrollViewDidScroll 移动 ChildViewController 的 subview

ios - 从 CoreData 获取返回 AnyObject