我可以在这个网站上看到几个类似的线程,但没有说明如何从数组中取回数据。
我正在尝试关闭服务器的PFFile并将其设置为集合视图中的图像
for object in packs {
self.packName.append(object["packName"] as! String)
self.packDescription.append(object["packDesctription"] as! String)
var objectImage = object["file"] as! PFFile
objectImage.getDataInBackground(block: { (imageData, error) in
if error == nil {
var myImage = UIImage(data: imageData!)
self.packImage.append(myImage!)
}
})
}
打印packImage会显示一堆数据:因此有一些内容......
[<UIImage: 0x608000287210>, {259, 194}]
[<UIImage: 0x608000287210>, {259, 194}, <UIImage: 0x600000287350>, {259, 194}]
[<UIImage: 0x608000287210>, {259, 194}, <UIImage: 0x600000287350>, {259, 194}, <UIImage: 0x6080002870d0>, {249, 192}]
[<UIImage: 0x608000287210>, {259, 194}, <UIImage: 0x600000287350>, {259, 194}, <UIImage: 0x6080002870d0>, {249, 192}, <UIImage: 0x6080002873f0>, {222, 160}]
[<UIImage: 0x608000287210>, {259, 194}, <UIImage: 0x600000287350>, {259, 194}, <UIImage: 0x6080002870d0>, {249, 192}, <UIImage: 0x6080002873f0>, {222, 160}, <UIImage: 0x600000286ea0>, {255, 198}]
[<UIImage: 0x608000287210>, {259, 194}, <UIImage: 0x600000287350>, {259, 194}, <UIImage: 0x6080002870d0>, {249, 192}, <UIImage: 0x6080002873f0>, {222, 160}, <UIImage: 0x600000286ea0>, {255, 198}, <UIImage: 0x608000287670>, {261, 193}]
[<UIImage: 0x608000287210>, {259, 194}, <UIImage: 0x600000287350>, {259, 194}, <UIImage: 0x6080002870d0>, {249, 192}, <UIImage: 0x6080002873f0>, {222, 160}, <UIImage: 0x600000286ea0>, {255, 198}, <UIImage: 0x608000287670>, {261, 193}, <UIImage: 0x600000286cc0>, {259, 194}]
[<UIImage: 0x608000287210>, {259, 194}, <UIImage: 0x600000287350>, {259, 194}, <UIImage: 0x6080002870d0>, {249, 192}, <UIImage: 0x6080002873f0>, {222, 160}, <UIImage: 0x600000286ea0>, {255, 198}, <UIImage: 0x608000287670>, {261, 193}, <UIImage: 0x600000286cc0>, {259, 194}, <UIImage: 0x608000287800>, {189, 267}]
[<UIImage: 0x608000287210>, {259, 194}, <UIImage: 0x600000287350>, {259, 194}, <UIImage: 0x6080002870d0>, {249, 192}, <UIImage: 0x6080002873f0>, {222, 160}, <UIImage: 0x600000286ea0>, {255, 198}, <UIImage: 0x608000287670>, {261, 193}, <UIImage: 0x600000286cc0>, {259, 194}, <UIImage: 0x608000287800>, {189, 267}, <UIImage: 0x600000287620>, {259, 194}]
然而,当我尝试将图像进一步向下设置时,我得到一个超出范围的错误索引。
cell.imageCell.image = packImage[indexPath.row]
----------编辑附件UICollectionViewDelegate的全部代码----------------
import UIKit
import Parse
private let reuseIdentifier = "Cell"
class PackViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {
//have to drag in outlet because not in CVC anymore
@IBOutlet var collectionView: UICollectionView!
//var delegate: PackViewDelegate?
var packName = [""] // the total packs in the app
var packDescription = [""]
var packTitle = [""]
var packImage = [UIImage]()
override func viewDidLoad() {
super.viewDidLoad()
let packQuery = PFQuery(className: "Pack")
packQuery.findObjectsInBackground(block: { (objectsArray, error) in
if error != nil {
print(error!)
} else if let packs = objectsArray {
self.packName.removeAll() // remove the empty strings
//self.packImage.removeAll()
self.packDescription.removeAll()
for object in packs {
self.packName.append(object["packName"] as! String)
self.packDescription.append(object["packDesctription"] as! String)
// get the PFFile from the server
var objectImage = object["file"] as! PFFile
objectImage.getDataInBackground(block: { (imageData, error) in
if error == nil {
//convert the data to an image and append it to array
var myImage = UIImage(data: imageData!)
self.packImage.append(myImage!)
print(self.packImage)
}
})
}
//only works when create iboutlet of collection view because in VC not CVC
self.collectionView?.reloadData()
}
})
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
// MARK: UICollectionViewDataSource
func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return packName.count
}
func UIColorFromHEX(hexValue: UInt) -> UIColor {
return UIColor(
red: CGFloat((hexValue & 0xFF0000) >> 16) / 255.0,
green: CGFloat((hexValue & 0x00FF00) >> 8) / 255.0,
blue: CGFloat(hexValue & 0x0000FF) / 255.0,
alpha: CGFloat(1.0)
)
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell: PackCollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! PackCollectionViewCell
cell.labelCell.text = packDescription[indexPath.row]
//////-------------------------------------------------------------- this is where it crashes
cell.imageCell.image = packImage[indexPath.row]
cell.imageCell.layer.masksToBounds = true
cell.imageCell.layer.cornerRadius = cell.imageCell.frame.height/2
cell.imageCell.layer.borderWidth = 3
cell.imageCell.layer.borderColor = UIColorFromHEX(hexValue: 0x62aca2).cgColor
return cell
}
public func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
// handle the segue to JourneyViewController with variable "selectedPack"
// not sure why you need to set the storyboard but it works
let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
//create instance of the viewcontroller
let transportJourneyViewController = storyBoard.instantiateViewController(withIdentifier: "JourneyViewController") as! JourneyViewController
//value to pass - has been defined in journey
transportJourneyViewController.selectedPack = packName[indexPath.row]
//present the vc
self.present(transportJourneyViewController, animated:true, completion:nil)
}
@IBAction func logoutButtonTapped(_ sender: Any) {
PFUser.logOut()
if (PFUser.current() == nil) {
performSegue(withIdentifier: "segueLogout", sender: self)
} else {
MyFunctions.createAlert(errorTitle: "Oops...", errorMessage: "Something happened when logging you out.", className: self)
}
}
} // class
答案 0 :(得分:2)
我认为array
存在问题。你的
packName.count > self.packImage.count
在self.packImage
方法中使用此数组numberOfItemsInSectionto
来删除崩溃
试试这个
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return self.packImage.count
}
希望它能帮到你
答案 1 :(得分:0)
indexPath.row
标识表视图部分中的行的索引号。
indexPath.item
标识集合视图的某个部分中的项目的索引号。
使用cell.imageCell.image = packImage[indexPath.item]
代替cell.imageCell.image = packImage[indexPath.row]
,因为它是一个集合视图。并检查集合视图数据源中的numberOfItemsInSection是否小于或等于packDescription,packImage数组。