我的项目有一个表视图(特别是PFQueryTableView,因为我使用Parse作为我的后端),它显示文本或图片(除了一些标准元素,如海报的个人资料图片和名称)。可以将其视为类似Facebook的Feed,其中帖子可以包含文本或图像。这意味着在我的" Yell" class(posts)," yellText" (帖子中的文字)或" pictureFromCamera" (图片中的帖子)值将为零。它们被加载到包含文本标签的自定义表格视图单元格(原型单元格)和图像的PFImageView。这允许我使用if / else语句更改单元格的格式,具体取决于" postText"或者" postImage"对于给定的细胞是零。这在我打开视图控制器时有效,它看起来像这样:
当我使用pull to refresh功能时,图像被放置在不属于它们的单元格中:
这就是我的对象在Parse中的样子:
包含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值被其他单元格的值替换?
答案 0 :(得分:0)
解决问题的一种方法是在表格单元类中实现func prepareForReuse()
,以便将单元格的所有元素重置为合理的值。这样,您可以确保每个单元格在重复使用之前都已清除,因此旧值不会显示出来。
另一个选择是确保在tableView(_ tableView:,cellForRowAtIndexPath:)
方法中设置单元格的每个元素。例如,如果您不使用自定义单元格类,这是合理的。