在Swift中水平滚动时如何首先显示特定数组值在UICollectionView中?

huangapple go评论62阅读模式
英文:

How to show a specific array value first in UICollectionView when scrolling horizontally in Swift?

问题

我正在从JSON中获取数组,以在CollectionView上显示数据。

JSON数据结构如下:

{
    id = 9;
    image = "1685696735-5869.jpg";
    "user_id" = 13;
},
{
    id = 17;
    image = "1685709043-8696.jpg";
    "user_id" = 13;
},....等等

我现在获取了selectedID和selectedImage的值,现在我需要在CollectionView中首先显示所选的ID数组值。

例如,如果selectedImage = 1685709043-8696.jpg,那么我需要在CollectionView的第一个单元格中首先显示image = "1685709043-8696.jpg",如何做到这一点?

代码: 如果getImagesData?.result?.userToGalleryselectedDataArray包含**selectedImage**,那么该单元格应首先显示在imageCollectionView中,其余的应水平滚动显示。

class AllGalleryImgViewController: UIViewController {
    
   private var getImagesData = GetGalleryImageModel(dictionary: NSDictionary()){
        didSet{
            
            self.selectedDataArray = getImagesData?.result?.userToGallery ?? []
            imagecollectionView.reloadData()
        }
    }
    
    public var selectedDataArray = [UserToGallery]()
    
    @IBOutlet weak var imagecollectionView: UICollectionView!
    var selectedImage: String!
    var selectedID: Int!
    var imagesArray = [String]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        getImagesServiceCall()
    }
    
    func getImagesServiceCall() {
        
        APIReqeustManager.sharedInstance.serviceCall(param: nil, method: .get, url: CommonUrl.my_gallery_image){ [weak self] (resp) in
            
            self?.getImagesData = GetGalleryImageModel(dictionary: resp.dict as NSDictionary? ?? NSDictionary())
        }
    }
}

extension AllGalleryImgViewController: UICollectionViewDelegate, UICollectionViewDataSource {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return getImagesData?.result?.userToGallery?.count ?? 0
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "AllBigGalleryCollectionCell", for: indexPath) as! AllBigGalleryCollectionCell
        
        cell.galleryImageView.getImage(withImagePath: getImagesData?.result?.userToGallery?[indexPath.item].image ?? "")
        
        return cell
    }
}

如何过滤数组并在CollectionView的第一个单元格中显示该值,当水平滚动时应显示其余的值。

英文:

I am getting Array from JSON to show data on collectionview

JSON data structure is like this:

            {
                id = 9;
                image = "1685696735-5869.jpg";
                "user_id" = 13;
            },
            {
                id = 17;
                image = "1685709043-8696.jpg";
                "user_id" = 13;
            },.... so on

i am getting selectedID and selectedImage value now i need to show that selectedID array value first in the collectionview

for eg selectedImage = 1685709043-8696.jpg then i need to show image = "1685709043-8696.jpg" first in collectionview first cell how to do that

code: here if getImagesData?.result?.userToGallery or selectedDataArray contains selectedImage then that cell should show first in imagecollectionView and remaining should scroll horizontally

class AllGalleryImgViewController: UIViewController {
    
   private var getImagesData = GetGalleryImageModel(dictionary: NSDictionary()){
        didSet{
            
            self.selectedDataArray = getImagesData?.result?.userToGallery ?? []
            imagecollectionView.reloadData()
        }
    }
    
    public var selectedDataArray = [UserToGallery]()
    
    @IBOutlet weak var imagecollectionView: UICollectionView!
    var selectedImage: String!
    var selectedID: Int!
    var imagesArray = [String]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        getImagesServiceCall()
    }
    func getImagesServiceCall() {
        
        APIReqeustManager.sharedInstance.serviceCall(param: nil, method: .get, url: CommonUrl.my_gallery_image){ [weak self] (resp) in
            
            self?.getImagesData = GetGalleryImageModel(dictionary: resp.dict as NSDictionary? ?? NSDictionary())
        }
    }
    }
    extension AllGalleryImgViewController: UICollectionViewDelegate, UICollectionViewDataSource {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return getImagesData?.result?.userToGallery?.count ?? 0 //10
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "AllBigGalleryCollectionCell", for: indexPath) as! AllBigGalleryCollectionCell
        
        cell.galleryImageView.getImage(withImagePath: getImagesData?.result?.userToGallery?[indexPath.item].image ?? "")
        
        return cell
    }
}

How to filer array and show that value in collectionview first cell

i need to show filtered image first in cell.galleryImageView.getImage(withImagePath: getImagesData?.result?.userToGallery?[indexPath.item].image ?? "") and remaining should show next when scrolling horizontally

答案1

得分: 1

为了在集合视图中首先显示所选图像,请修改您的 selectedDataArray 属性以保存包含所选图像的筛选数组,如下所示:

var selectedDataArray = [UserToGallery]() {
    didSet {
        if let selectedImage = selectedImage {
            let filteredArray = selectedDataArray.filter { $0.image == selectedImage }
            let remainingArray = selectedDataArray.filter { $0.image != selectedImage }
            self.selectedDataArray = filteredArray + remainingArray
        }
    }
}

collectionView(_:cellForItemAt:) 方法中,使用 indexPath.item 从筛选后的数组中获取图像:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "AllBigGalleryCollectionCell", for: indexPath) as! AllBigGalleryCollectionCell
    
    cell.galleryImageView.getImage(withImagePath: selectedDataArray[indexPath.item].image)
    
    return cell
}

更新 collectionView(_:numberOfItemsInSection:) 方法以返回筛选数组的计数:

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

To display the selected image first in the collection view ,

Modify your selectedDataArray property to hold the filtered array with the selected image at the beginning,

var selectedDataArray = [UserToGallery]() {
    didSet {
        if let selectedImage = selectedImage {
            let filteredArray = selectedDataArray.filter { $0.image == selectedImage }
            let remainingArray = selectedDataArray.filter { $0.image != selectedImage }
            self.selectedDataArray = filteredArray + remainingArray
        }
    }
}

In the collectionView(_:cellForItemAt:) method, access the image from the filtered array using indexPath.item

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "AllBigGalleryCollectionCell", for: indexPath) as! AllBigGalleryCollectionCell
    
    cell.galleryImageView.getImage(withImagePath: selectedDataArray[indexPath.item].image)
    
    return cell
}

Update the collectionView(_:numberOfItemsInSection:) method to return the count of the filtered array,

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

huangapple
  • 本文由 发表于 2023年6月5日 13:55:09
  • 转载请务必保留本文链接:https://go.coder-hub.com/76403800.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定