Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.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 加载viewcontroller后加载collectionview的ImageView_Ios_Swift_Firebase_Uicollectionview_Uiimageview - Fatal编程技术网

Ios 加载viewcontroller后加载collectionview的ImageView

Ios 加载viewcontroller后加载collectionview的ImageView,ios,swift,firebase,uicollectionview,uiimageview,Ios,Swift,Firebase,Uicollectionview,Uiimageview,因此,我正在swift中构建一个应用程序,用户可以上传带有图片的产品。上传效果很好,但我遇到的问题是图片的下载。用户获得所有产品的概览并单击它们,这会让他看到该产品的详细概览。在该概述中,有一个包含所有图像的collectionview(这就是目标)。我的问题是图片加载速度太慢,无法显示在屏幕上。我想知道是否有一个选项可以在一个函数中提供图像视图,并将图像分配给它们,并且在屏幕已经加载之后,图片将逐个加载 这是我现在用来加载图像的功能: func getPictures(imageStr

因此,我正在swift中构建一个应用程序,用户可以上传带有图片的产品。上传效果很好,但我遇到的问题是图片的下载。用户获得所有产品的概览并单击它们,这会让他看到该产品的详细概览。在该概述中,有一个包含所有图像的collectionview(这就是目标)。我的问题是图片加载速度太慢,无法显示在屏幕上。我想知道是否有一个选项可以在一个函数中提供图像视图,并将图像分配给它们,并且在屏幕已经加载之后,图片将逐个加载

这是我现在用来加载图像的功能:

    func getPictures(imageStrings: [String], imageViews: [UIImageView]){
        let storage = Storage.storage();
        for index in 0...imageStrings.count - 1 {
            let gsReference = storage.reference(forURL: imageStrings[index])
            gsReference.getData(maxSize: 15 * 1024 * 1024) { data, error in
                    if let error = error {
                            // Uh-oh, an error occurred!
                            print(error)
                            return
                    } else {
                        DispatchQueue.main.async {
                        imageViews[index].image = UIImage(data: data!)
                        }
                        print(UIImage(data: data!) as Any)
                    }
            }
        }
    }

这是“我的收藏”视图处于活动状态的viewcontroller

import MessageUI
import FirebaseStorage

class ProductDetailViewController: UIViewController, MFMailComposeViewControllerDelegate, UINavigationControllerDelegate, UICollectionViewDelegate, UICollectionViewDataSource   {


    @IBOutlet var TitleLable: UILabel!
    @IBOutlet var PriceLable: UILabel!
    @IBOutlet var ProductDate: UILabel!
    @IBOutlet var UsernameLable: UILabel!
    @IBOutlet var LocationLable: UILabel!
    @IBOutlet var Userdate: UILabel!
    @IBOutlet var ReserveerButton: UIButton!
    @IBOutlet var DescriptionTextView: UITextView!
    @IBOutlet var collectionView: UICollectionView!

    var titleLable = String()
    var priceLable = String()
    var productDate = String()
    var descriptionLable = String()
    var userId = String()
    var usernameLable = String()
    var locationLable = String()
    var userdate = String()
    var email = String()
    var imageStrings = [String]()
    var images = [UIImage]()
    var dbhelper = DBHelper()

    override func viewDidLoad() {
        super.viewDidLoad()
        ReserveerButton.layer.cornerRadius = 20
        loadUser(id: userId)
        TitleLable.text = titleLable
        PriceLable.text = priceLable
        ProductDate.text = productDate
        DescriptionTextView.text = descriptionLable
        UsernameLable.text = usernameLable
        loadImages()    

        // Do any additional setup after loading the view.
    }

    private func loadUser(id: String){
        let dbhelper = DBHelper()
        dbhelper.getUserbyUserID(id: id){ success in
            if(dbhelper.users[0].Bedrijf != "NULL"){
                self.UsernameLable.text = dbhelper.users[0].Bedrijf
            } else {
                self.UsernameLable.text = dbhelper.users[0].Voornaam + " " + dbhelper.users[0].Familienaam
            }
            self.Userdate.text = dbhelper.users[0].Added_on
            self.LocationLable.text = dbhelper.users[0].Stad
            self.email = dbhelper.users[0].Email
        }
    }

    @IBAction func ReserveerProduct(_ sender: Any) {
        if !MFMailComposeViewController.canSendMail() {
            print("Mail services are not available")
            return
        }

        let composeVC = MFMailComposeViewController()
        composeVC.mailComposeDelegate = self

        // Configure the fields of the interface.
        composeVC.setToRecipients([self.email])
        composeVC.setSubject(self.titleLable)
        composeVC.setMessageBody("Beste " + self.usernameLable + ", \n\nIk zou graag het zoekertje " + self.titleLable + " reserveren.  Is dit nog steeds mogelijk? \n\nMet vriendelijke groet" , isHTML: false)

        // Present the view controller modally.
        self.present(composeVC, animated: true, completion: nil)

    }

    func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {

        switch result.rawValue {
        case MFMailComposeResult.cancelled.rawValue :
            print("Cancelled")

        case MFMailComposeResult.failed.rawValue :
            print("Failed")

        case MFMailComposeResult.saved.rawValue :
            print("Saved")

        case MFMailComposeResult.sent.rawValue :
            print("Sent")
        default: break
        }
        self.dismiss(animated: true, completion: nil)
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return imageStrings.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ImageCollectionViewCell", for: indexPath) as! ImageCollectionViewCell
        cell.contentMode = .scaleAspectFill
        return cell
    }

    func loadImages(){
        let dbhelper = DBHelper()
        //dbhelper.getPictures2(imageStrings: self.imageStrings, imageViews: self.images)
    }

}
希望我能最终解决这个问题! 问候
B.

我想您面临的问题是在加载图像后不更新收藏视图

首先,您的
getPictures(…)
方法需要一个UIImageView数组。但事实上,您不能将它们传递给方法,因为它们是在collectionView中动态创建的。相反,您应该在图像加载后返回它们。问题是图像是异步加载的。这意味着您需要使用完成处理程序

func getPictures(imageStrings: [String], completionHandler: @escaping (UIImage) -> ()) {
    let storage = Storage.storage();
    for index in 0...imageStrings.count - 1 {
        let gsReference = storage.reference(forURL: imageStrings[index])
        gsReference.getData(maxSize: 15 * 1024 * 1024) { data, error in
                if let error = error {
                        // Uh-oh, an error occurred!
                        print(error)
                        return
                } else {
                    completionHandler(UIImage(data: data!))
                    print(UIImage(data: data!) as Any)
                }
        }
    }
}
然后需要修改
loadImages()
方法:

    func loadImages() {
        let dbhelper = DBHelper()
        dbhelpergetPictures(imageStrings: [""]) { (loadedImage) in
            DispatchQueue.main.async {
                self.images.append(loadedImage)
                self.collectionView.reloadData()
            }
        }
    }
之后,您需要修改collectionView(numberOfItemsInSection)方法,以使显示的单元格数等于加载的图像数:

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return images.count
}
最后,您需要在集合视图中的UIImageView中实际显示图像:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ImageCollectionViewCell", for: indexPath) as! ImageCollectionViewCell
    cell.contentMode = .scaleAspectFill
    cell.imageView.image = images[indexPath.row]
    return cell
}
如果你对此有任何疑问,请在评论中提问

(注:一个善意的建议:看看swift命名约定()。除了类之外,所有名称都应该以小写字母开头,并且应该描述它们的用途。 例子:
var titleable:UILabel!
->
var titleable:UILabel!
和:
var titleLable=String()
->
var title=String()

这将使您的代码更容易理解!)

请详细说明您的问题。。我想知道是否有在函数中提供图像视图并为其分配图像的选项。。这条线是什么意思?您还需要使用一些库从服务器获取图像…您好!是的,就像我上面问题中的函数“getpictures”。我从firebase获取图像,要从firebase获取图像,我需要一个imageString,但我想知道是否可以在该函数中从collectionview将图像分配给imageview?为什么一次获取所有图像?一旦collectionViewCell需要加载它们,它们就应该加载?您可以共享您的collectionView代码吗?我可以为您提供在CollectionView中加载图像的优雅解决方案谢谢!我已经添加了代码。谢谢你的建议和所有帮助。当我尝试实现getpictures方法时,它会给出一个错误“转义闭包捕获非转义参数'completionHandler”。你知道为什么会这样吗?是的。这是因为我忘了什么;)我更新了答案。您只需要在参数前面添加@escaping。您好,再次感谢您的回答。不幸的是,我在填充单元格的imageView时出错。它在
cell.imageView.image=images[indexPath.row]
line上给出了一个“线程1:致命错误:隐式展开可选值时意外发现nil”。发生这种情况是因为您试图访问images数组中不存在的元素。请尝试更改
var images=[UIImage]()
to
var images:[UIImage]=Array()
做到了这一点,但不幸的是仍然存在同样的问题。