【发布时间】:2017-07-27 16:19:46
【问题描述】:
我正在尝试创建类似于 Facebook NewsFeed 的东西,我正在使用自定义 UICollectionViewCell 来显示来自 JSON 的数据(文本/图像)。我有 2 个不同的 API。一个用于文本,另一个用于图像(每个单元格都没有图像)。
所以,首先我从我的 textAPI 将所有文本值输入到我的单元格中并重新加载 myCollectionView。效果很好。
现在对于图片,我正在使用 ImageFetcher 来获取图片,
func ImageFetcher(postId : NSNumber, completion : ((_ image: UIImage?) -> Void)!) {
var image = UIImage()
let urlString = "http://myImageAPI/Image/\(postId)"
let jsonUrlString = URL(string: urlString)
print(urlString)
URLSession.shared.dataTask(with: jsonUrlString!) { (data, response, error) in
do {
if let jsonData = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? [String:Any] {
if let images = jsonData["Image"] as? String {
if images == "" {
print("No Image")
} else {
let dataDecoded : Data? = Data(base64Encoded: images, options: .ignoreUnknownCharacters)
image = UIImage(data: dataDecoded!)!
completion(image)
}
}
}
else {
completion(nil)
}
} catch {
print(error.localizedDescription)
}
}.resume()
}
要在单元格中显示图像,
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
// Displaying other elements with text
DispatchQueue.main.async {
self.ImageFetcher(postId: self.myArray[indexPath.item].id!, completion: { (image) -> Void in
customCell.mainImage.image = image
})
// Declared "indexPaths" var indexPaths = [IndexPath]()
// Added this lines
// let indexPath = IndexPath(item: indexPath.item, section: 0)
// self.indexPaths.append(indexPath)
}
return customCell
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
self.jsonParsing()
}
func jsonParsing() {
//Fetching text data from textAPI
//DispatchQueue.main.async {
// self.collectionView.reloadItems(at: self.indexPaths)
//}
}
代码可以正常工作,但问题是图像仅在我单击它们时出现。 (我可以在一个单元格中看到空白/白色的 imageView,直到我点击它。只要我点击 imageView,就会出现图像)我觉得它与 DispatchQueue.main.async 有关系,但不确定。
我不想在获取图像后重新加载整个 collectionView。只想重新加载那些有图像的单元格。我发现
collectionView.reloadItemsAtIndexPaths(myArrayOfIndexPaths)
在许多解决方案上,但不知道如何使其在这种情况下工作。任何人都可以在这里帮助我吗?任何帮助将不胜感激。
【问题讨论】:
-
Take ref from here. 如果您还需要帮助,可以询问。
-
谢谢!!让我试试看。
-
你能再解释一下吗 -> 问题是图片只有在我点击它们时才会出现
-
更新了问题。如果您需要任何其他详细信息,请告诉我。
-
请添加 textMethods 的完整代码,
cellForItem&didSelectRow。您的代码似乎很完美。你不需要重新加载。所以 isuue 在别的地方。
标签: ios swift grand-central-dispatch uicollectionviewcell