Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在swift中以编程方式添加CollectionView项_Ios_Swift_Uicollectionview - Fatal编程技术网

Ios 在swift中以编程方式添加CollectionView项

Ios 在swift中以编程方式添加CollectionView项,ios,swift,uicollectionview,Ios,Swift,Uicollectionview,我已经为照片显示创建了collectionView项。如果我从库中选择照片并成功上传,那么上传的照片会显示得非常完美 问题是:从库中选择照片后和照片上载期间,collectionview为空,在最终上载之前,没有活动意味着间隙很小。我需要添加collectionView项,此时使用活动指示器 我不知道我在哪里实际附加了这个项目。我需要用带有活动指示器的append collectionview项目来弥补这段间隔时间 withTLPHAssets包含选定图像的值 var imageAppData:

我已经为照片显示创建了collectionView项。如果我从库中选择照片并成功上传,那么上传的照片会显示得非常完美

问题是:从库中选择照片后和照片上载期间,collectionview为空,在最终上载之前,没有活动意味着间隙很小。我需要添加collectionView项,此时使用活动指示器

我不知道我在哪里实际附加了这个项目。我需要用带有活动指示器的append collectionview项目来弥补这段间隔时间

withTLPHAssets包含选定图像的值

var imageAppData:响应数据

我的数据源是let dic=AppData?.imageList?[indexPath.row].url

型号:

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
        }