Swift / Parse:表格视图单元格中的元素,其中nil值显示来自其他单元格的值

时间:2015-07-14 08:45:38

标签: ios swift parse-platform

我的项目有一个表视图(特别是PFQueryTableView,因为我使用Parse作为我的后端),它显示文本或图片(除了一些标准元素,如海报的个人资料图片和名称)。可以将其视为类似Facebook的Feed,其中帖子可以包含文本或图像。这意味着在我的" Yell" class(posts)," yellText" (帖子中的文字)或" pictureFromCamera" (图片中的帖子)值将为零。它们被加载到包含文本标签的自定义表格视图单元格(原型单元格)和图像的PFImageView。这允许我使用if / else语句更改单元格的格式,具体取决于" postText"或者" postImage"对于给定的细胞是零。这在我打开视图控制器时有效,它看起来像这样:

enter image description here

当我使用pull to refresh功能时,图像被放置在不属于它们的单元格中:

enter image description here

这就是我的对象在Parse中的样子:

enter image description here

包含PFQueryTableView的容器视图的代码如下:

class YellContentTableViewController: PFQueryTableViewController {

var posterFirstName: String!
var hasUpvoted: Bool?

// Initialise the PFQueryTable tableview
override init(style: UITableViewStyle, className: String!) {
    super.init(style: style, className: className)


}

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)

    // Configure the PFQueryTableView
    self.parseClassName = "Yell"
    self.textKey = "yellText"
    self.pullToRefreshEnabled = true
    self.paginationEnabled = true
    if (self.paginationEnabled == true){
      self.objectsPerPage = 20
    }
}


// Define the query that will provide the data for the table view
override func queryForTable() -> PFQuery {
    var query = PFQuery(className: "Yell")
    query.orderByDescending("createdAt")


    return query
}


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath, object: PFObject?) -> PFTableViewCell {

    var cell = tableView.dequeueReusableCellWithIdentifier("CustomCell") as! CustomTableViewCell!
    if cell == nil {
        cell = CustomTableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "CustomCell")
    }

          if let posterFirstName = object?["posterFirstName"] as? String {
        cell.customPosterFirstName.text = posterFirstName
    }

     //Display poster's profile picture
    var initialThumbnail = UIImage(named: "Temporary")
    cell.customPosterProfilePicture.image = initialThumbnail
    if let thumbnail = object?["posterProfilePicture"] as? PFFile {
        cell.customPosterProfilePicture.file = thumbnail
        cell.customPosterProfilePicture.loadInBackground()
    }

    if let score = object?.valueForKey("voteCount") as? Int {
    cell.yellVotes.text = "\(score)"

    }


     let yellText = object?["yellText"] as? String
    if (yellText == "a"){
    cell.customYellText.text = ""
    var pictureFromCamera = object?["pictureFromCamera"] as? PFFile

         tableView.rowHeight = 90
            cell.customPictureFromCamera.file = pictureFromCamera
            cell.customPictureFromCamera.loadInBackground()

    }

    if (yellText != "a"){
     tableView.rowHeight = 60
    if let yellText = object?["yellText"] as? String {
        cell.customYellText.text = yellText
         cell.customPictureFromCamera.file = nil
    }

    }


    return cell
}

原型单元格:

class CustomTableViewCell: PFTableViewCell {

@IBOutlet weak var customPictureFromCamera: PFImageView!
@IBOutlet weak var customYellText: UILabel!
@IBOutlet weak var customPosterFirstName: UILabel!
@IBOutlet weak var customPosterProfilePicture: PFImageView!

这些插座连接到故事板中原型单元格中的imageViews和标签。

您可能会注意到,CustomTableViewCell是否被格式化为图片单元格或文本单元格的决定因素是关于yellText == A的if / else语句。首先,这是基于if / else声明如果customPictureFromCamera == nil。然而,当我这样做时,来自其他单元格的yellTexts将被输入到图片单元格中(其中Parse对象中的yellText元素未定义/ nil)。我对此的快速而肮脏的解决方案是将yellText设置为" a"对于所有图片帖子(" Yells"),将if / else语句设置为依赖于yellText ==" a",如果是,则设置yellText ="&# 34;这样图片单元格中就没有文字了。这有效,但显然不是一个优雅的解决方案。我考虑了一个类似于我的图片问题的方法(将一个小文件上传到Parse对象中的pictureFromCamera元素,以便它不再设置为undefined / nil),但它会非常低效,所以我希望能找到更好的解决方案。

那么,有没有人知道为什么刷新PFQueryTableView导致给定单元格的nil值被其他单元格的值替换?

1 个答案:

答案 0 :(得分:0)

解决问题的一种方法是在表格单元类中实现func prepareForReuse(),以便将单元格的所有元素重置为合理的值。这样,您可以确保每个单元格在重复使用之前都已清除,因此旧值不会显示出来。

另一个选择是确保在tableView(_ tableView:,cellForRowAtIndexPath:)方法中设置单元格的每个元素。例如,如果您不使用自定义单元格类,这是合理的。