Ios 在swift中以编程方式添加CollectionView项
我已经为照片显示创建了collectionView项。如果我从库中选择照片并成功上传,那么上传的照片会显示得非常完美 问题是:从库中选择照片后和照片上载期间,collectionview为空,在最终上载之前,没有活动意味着间隙很小。我需要添加collectionView项,此时使用活动指示器 我不知道我在哪里实际附加了这个项目。我需要用带有活动指示器的append collectionview项目来弥补这段间隔时间 withTLPHAssets包含选定图像的值 var imageAppData:响应数据 我的数据源是let dic=AppData?.imageList?[indexPath.row].url 型号:Ios 在swift中以编程方式添加CollectionView项,ios,swift,uicollectionview,Ios,Swift,Uicollectionview,我已经为照片显示创建了collectionView项。如果我从库中选择照片并成功上传,那么上传的照片会显示得非常完美 问题是:从库中选择照片后和照片上载期间,collectionview为空,在最终上载之前,没有活动意味着间隙很小。我需要添加collectionView项,此时使用活动指示器 我不知道我在哪里实际附加了这个项目。我需要用带有活动指示器的append collectionview项目来弥补这段间隔时间 withTLPHAssets包含选定图像的值 var imageAppData:
struct ResponseData: Codable {
var imageList : [ImageList]?
}
struct ImageList : Codable {
let url : String = ""
let projectUnitImageId : Int = 0
}
集合视图:
我添加了func dismissPhotoPicker
代码:
cellForItemAt:
public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellName, for: indexPath) as! PhotoCollectionViewCell
if(indexPath.row < (AppData?.imageList?.count ?? 0)){
cell.imageView.isHidden = false
cell.closeIcon.isHidden = false
cell.addIcon.isHidden = true
let dic = AppData?.imageList?[indexPath.row].url ?? " "
//cell.imageView.image = UIImage(url: URL(string: dic))
let url = URL(string: dic)
cell.imageView.kf.indicatorType = .activity
cell.imageView.kf.setImage(
with: url,
placeholder: UIImage(named: "placeholder"),
options: [
.scaleFactor(UIScreen.main.scale),
.transition(.fade(1)),
.cacheOriginalImage
])
{
result in
switch result {
case .success(let value):
print("Task done for: \(value.source.url?.absoluteString ?? "")")
case .failure(let error):
print("Job failed: \(error.localizedDescription)")
}
}
let imgId = AppData?.imageList?[indexPath.row].projectUnitImageId
cell.closeIcon.isUserInteractionEnabled = true
cell.closeIcon.tag = imgId ?? 0
deleteAlertView.delegate = self
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(removeImage(_:)))
cell.closeIcon.addGestureRecognizer(tapGestureRecognizer)
} else {
cell.imageView.isHidden = true
cell.closeIcon.isHidden = true
cell.addIcon.isHidden = true
}
return cell
}
看起来你们已经有很多逻辑了。。。一切都应该或多或少地从数据源进行控制。我不知道cellForItemAt indexPath函数中的许多函数是做什么的,但我猜测可以实现如下逻辑: 修改您的imageList?[Int].url以具有可选url,因此imageList?[].url 修改cellForItemAt indexPath以隐藏imageView,除非存在有效的url(即,不是nil) 一旦从选取器收集到一个资源,在imageList中创建并附加一个新的图像,但url为nil。使用重新加载的数据重新加载集合视图。此时,numberOfItemsInSection函数应该返回正确数量的项目,最后一个单元格将显示活动指示器,因为图像视图是隐藏的 上传照片并获得url/资源后。更新imageList中的相应数据并再次调用reloadData 您还可以在数据输入后手动更新最后一个单元格的内容。因此,您不必再次调用reloadData
另一种选择是,在他们选择图像后,简单地附加到imageList并手动创建数据,然后在上传完成后不执行任何操作。这看起来是即时的,上传将在后台进行。我们可以看到您的cellForItemAt indexPath函数吗?这将有助于理解如何填充单元格的逻辑,以及用于“集合”视图的数据源的类型。@SanzioAngeli我已更新了cellForItemAt代码谢谢让我尝试实现并回复您。
func dismissPhotoPicker(withTLPHAssets: [TLPHAsset]) {
// use selected order, fullresolution image
for indexPath in self.collectionView.indexPathsForVisibleItems {
if let cell = self.collectionView.cellForItem(at: indexPath) as? PhotoCollectionViewCell {
}
}
self.selectedAssets = withTLPHAssets
for img in withTLPHAssets{
let asset = img
if asset.type == .photo {
let displayImage = asset.fullResolutionImage!
let unitId = UserDefaults.standard.integer(forKey: "unitID")
let strUnit = String(describing: unitId)
let finalURL = Common.DEFAULT_HOST.url + "data/AddImages"
guard let token = UserDefaults.standard.string(forKey: "newToken") else {
print("invalid token")
return
}
let image = displayImage
let imgData = image.jpegData(compressionQuality: 0.2)!
let parameters = ["ProjId": strUnit] //Optional for extra parameter
Alamofire.upload(multipartFormData: { multipartFormData in
multipartFormData.append(imgData, withName: "ImageList",fileName: "file.jpg", mimeType: "image/jpg")
for (key, value) in parameters {
multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key)
} //Optional for extra parameters
},
to: finalURL, headers: [ "Accept":"application/json", "Authorization":"Bearer \(token)"])
{ (result) in
switch result {
case .success(let upload, _, _):
upload.uploadProgress(closure: { (progress) in
print("Upload Progress: \(progress.fractionCompleted)")
})
upload.responseJSON { response in
print(response.result.value)
self.pullData()
}
case .failure(let encodingError):
print(encodingError)
}
}
}
}
public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellName, for: indexPath) as! PhotoCollectionViewCell
if(indexPath.row < (AppData?.imageList?.count ?? 0)){
cell.imageView.isHidden = false
cell.closeIcon.isHidden = false
cell.addIcon.isHidden = true
let dic = AppData?.imageList?[indexPath.row].url ?? " "
//cell.imageView.image = UIImage(url: URL(string: dic))
let url = URL(string: dic)
cell.imageView.kf.indicatorType = .activity
cell.imageView.kf.setImage(
with: url,
placeholder: UIImage(named: "placeholder"),
options: [
.scaleFactor(UIScreen.main.scale),
.transition(.fade(1)),
.cacheOriginalImage
])
{
result in
switch result {
case .success(let value):
print("Task done for: \(value.source.url?.absoluteString ?? "")")
case .failure(let error):
print("Job failed: \(error.localizedDescription)")
}
}
let imgId = AppData?.imageList?[indexPath.row].projectUnitImageId
cell.closeIcon.isUserInteractionEnabled = true
cell.closeIcon.tag = imgId ?? 0
deleteAlertView.delegate = self
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(removeImage(_:)))
cell.closeIcon.addGestureRecognizer(tapGestureRecognizer)
} else {
cell.imageView.isHidden = true
cell.closeIcon.isHidden = true
cell.addIcon.isHidden = true
}
return cell
}