需要一些有关如何解决此问题的指导。我不确定我是否完全过度复杂化了,或者它是否一团糟。
我有一个UICollectionView,我希望它总是有9个单元格,我希望用户能够通过点击单元格来插入帖子。因此,如果他们按下单元格 8,他们就会发布帖子,它会显示在第 8 个单元格中,周围可能有 8 个其他空单元格。
我正在从火力基地发布/拉取这些帖子...所以我认为流程需要看起来像这样:
1)制作一个包含9个空[帖子]的空数组,以便单元格出现并可单击。
2)在火力基地观察员..如果说有 3 个帖子可以返回,它会将它们插入到 post 数组中/替换 3 个空帖子。
3)我希望帖子在整个网格中随机显示,所以我想在重新加载数据之前我会洗牌数组?
4)我真的不在乎从Firebase返回的帖子是否与用户放置的帖子位于同一位置,但是我希望当用户放置帖子时,它与放置帖子的位置相同,所以我想我会将变量保存到Firebase,例如"位置:8",我会说"如果您的用户uid =帖子的uid, 获取位置编号并将该帖子插入数组的该索引处。
这种流动是否偏离了基础,或者有更好的方法来实现这一目标?我还没有看到太多关于将项目插入到表视图/集合视图中的某些位置的信息。
编辑:
func fillWithBlanks() {
for i in 0 ..< 9 {
let blankPost = Post(timestamp: 99999999999999999, picURL: nil, postKey: "") // 100% need a better timestamp there, just filler for now.
postsArray.append(blankPost)
}
}
然后
DataService.ds.REF_POSTS.queryOrderedByChild("timestamp").queryStartingAtValue(cutoff).observeEventType(.ChildAdded, withBlock: { (snapshot:FIRDataSnapshot) in
let time = snapshot.value!["timestamp"] as? Int
let text = snapshot.value!["text"] as? String
let picURL = snapshot.value!["imageURL"] as? String
let key = snapshot.key
let post = Post(timestamp: time!, picURL: picURL!, postKey: key)
self.postsArray[self.selectedPostIndex] = post
self.collectionView.reloadData()
})
所以基本上在viewDidLoad上,我调用fillWithBlanks(),然后当我选择一个单元格时,我将选定的PostIndex设置为单击的索引,创建一个帖子,并将其插入到我选择的位置。
这有效,我通过在按下单元格时打印出单元格的时间戳来测试它,并且确定当我发布帖子时,时间戳适用于帖子而不是99999999。
我遇到的大问题是图片。当我加载时,我得到 9 个空单元格,但当我发布帖子时,它会将我为帖子设置的图片设置为所有 9 个单元格,然后如果我发布 2 个帖子,我会在第一张图片、第二张图片和空白单元格的空白背景之间的所有单元格中闪烁。
当我发布帖子时,我会将下载网址保存到 firebase,然后我有一个缓存系统来下载帖子或抓取它们。在尝试实施空白帖子之前,这一切都有效。
任何想法会导致这种情况吗?我不明白为什么在应用程序加载时附加新帖子会对我制作的空白帖子产生任何影响。我假设我对类有一些误解,我的 Post 数组/Post 对象不是它们需要的。
编辑 2:
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let post = postsArray[indexPath.row]
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("MainCell", forIndexPath: indexPath) as! PostCell
if let imageURL = post.picURL {
cell.cellImage.loadImageUsingNSCache(imageURL)
}
return cell
}
.loadimagesUsingNSCache 来自:
extension UIImageView {
func loadImageUsingNSCache(urlString: String){
if let cachedImage = imageCache.objectForKey(urlString) as? UIImage {
self.image = cachedImage
return
}
let url = NSURL(string: urlString)
NSURLSession.sharedSession().dataTaskWithURL(url!, completionHandler: { (data: NSData?, response: NSURLResponse?, error: NSError?) in
if error != nil {
print(error)
return
}
dispatch_async(dispatch_get_main_queue(), {
if let downloadedImage = UIImage(data: data!) {
imageCache.setObject(downloadedImage, forKey: urlString)
self.image = UIImage(data: data!)
}
})
}).resume()
}
关于图像的问题,请记住集合视图单元格是可重复使用的项目,因此每次调用collectionView(cellForItemAtIndexPath)
时,您需要告诉其中每个项目的内容。
这意味着您需要每次都为 cell.cellImage
提供一个值,即使post.picURL
nil
。在这种情况下,您可以说cell.cellImage = nil
或显示默认的空图片。