如何通过 NSArray 显示自定义 UICollectionViewCell?

Posted

技术标签:

【中文标题】如何通过 NSArray 显示自定义 UICollectionViewCell?【英文标题】:How to show custom UICollectionViewCell by NSArray? 【发布时间】:2019-07-16 12:48:19 【问题描述】:

我有三个自定义UICollectionViewCell

RepoOfTheMonthCell 来自TheEditorsCell WorldPremiereCell

我有一个NSArray 包含这些单元格的顺序和这些单元格应显示的内容。 ('cellClass' 是一个类。)

(
    "<RSHomeItem> \n   [title]: REPO\n   OF THE\n   MONTH\n   [img]: https://nexusrepo.kro.kr/repostore/img0.png\n   [url]: https://nexusrepo.kro.kr/\n   [cellClass]: RepoOfTheMonth\n   [subtitle]: <nil>\n</RSHomeItem>",
    "<RSHomeItem> \n   [title]: REPO STORE\n   [img]: https://nexusrepo.kro.kr/repostore/img1.png\n   [url]: <nil>\n   [cellClass]: FromTheEditors\n   [subtitle]: Welcome to the\n   Repo Store!\n</RSHomeItem>",
    "<RSHomeItem> \n   [title]: FEATURED REPO\n   [img]: https://nexusrepo.kro.kr/repostore/img2.png\n   [url]: https://nexusrepo.kro.kr\n   [cellClass]: WorldPremiere\n   [subtitle]: <nil>\n</RSHomeItem>"
)

所以,在- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath; 我像这样循环了NSArray

self.listHome 是一个NSArray。而且这个数组很特殊,所以我需要使用RSHomeItem(JSONModel) 来获取字符串中'cellClass'的值。

for (RSHomeItem *item in self.listHome) 
    NSLog(@"class: %@", item.cellClass);

此方法已记录

class: RepoOfTheMonth
class: FromTheEditors
class: WorldPremiere

所以我写了这个

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
    int i = 0;
    for (RSHomeItem *item in self.listHome) 
        NSIndexPath *iIndexPath = [NSIndexPath indexPathForRow:i inSection:0];
        if ([item.cellClass isEqualToString:@"RepoOfTheMonth"]) 
            RepoOfTheMonthCell *repo = [collectionView dequeueReusableCellWithReuseIdentifier:@"RepoOfTheMonth" forIndexPath:iIndexPath];
            [repo.imageView sd_setImageWithURL:[NSURL URLWithString:item.img]];
            [repo withTitle:item.title URL:item.url];

            return repo;
         else if ([item.cellClass isEqualToString:@"FromTheEditors"]) 
            FromTheEditorsCell *editors = [collectionView dequeueReusableCellWithReuseIdentifier:@"FromTheEditors" forIndexPath:iIndexPath];
            [editors.imageView sd_setImageWithURL:[NSURL URLWithString:item.img]];
            editors.titleLabel.text = item.title;
            editors.subtitleLabel.text = item.subtitle;

            return editors;
         else if ([item.cellClass isEqualToString:@"WorldPremiere"]) 
            WorldPremiereCell *premiere = [collectionView dequeueReusableCellWithReuseIdentifier:@"WorldPremiere" forIndexPath:indexPath];
            [premiere.imageView sd_setImageWithURL:[NSURL URLWithString:item.img]];
            [premiere withTitle:item.title URL:item.url];

            return premiere;
        

        i = i + 1;
    

    return nil;

它构建得很好,但它显示了三个具有相同数据的RepoOfTheMonthCell,而不是按此顺序显示单元格。

    RepoOfTheMonthCell 来自TheEditorsCell WorldPremiereCell

numberOfSection 为“1”,numberOfRow 为“self.listHome.count”

【问题讨论】:

在您的问题中附上您的func numberOfSections(in collectionView: UICollectionView) -&gt; Int 部分编号 @Vicky_Vignesh numberOfSection 为“1”,行为“self.listHome.count” 打个断点,每次迭代查看item.cellClass中的值。 @Vicky_Vignesh 我认为这是因为return cell; 这使得忽略循环。 @Vicky_Vignesh 刚刚找到了修复它的方法。它在答案中。看看吧。 【参考方案1】:

好的,我不需要循环播放它。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
    RSHomeItem *item = self.listHome[indexPath.row];

    if ([item.cellClass isEqualToString:@"RepoOfTheMonth"]) 
        RepoOfTheMonthCell *repo = [collectionView dequeueReusableCellWithReuseIdentifier:@"RepoOfTheMonth" forIndexPath:indexPath];
        [repo.imageView sd_setImageWithURL:[NSURL URLWithString:item.img]];
        [repo withTitle:item.title URL:item.url];

        return repo;
    

    if ([item.cellClass isEqualToString:@"FromTheEditors"]) 
        FromTheEditorsCell *editors = [collectionView dequeueReusableCellWithReuseIdentifier:@"FromTheEditors" forIndexPath:indexPath];
        [editors.imageView sd_setImageWithURL:[NSURL URLWithString:item.img]];
        editors.titleLabel.text = item.title;
        editors.subtitleLabel.text = item.subtitle;

        return editors;
    

    if ([item.cellClass isEqualToString:@"WorldPremiere"]) 
        WorldPremiereCell *premiere = [collectionView dequeueReusableCellWithReuseIdentifier:@"WorldPremiere" forIndexPath:indexPath];
        [premiere.imageView sd_setImageWithURL:[NSURL URLWithString:item.img]];
        [premiere withTitle:item.title URL:item.url];

        return premiere;
    

    return nil;

【讨论】:

以上是关于如何通过 NSArray 显示自定义 UICollectionViewCell?的主要内容,如果未能解决你的问题,请参考以下文章

通过 WatchConnectivity 的 sendMessageData 将自定义对象的 NSArray 作为 NSData 传递

如何从自定义类中检索 NSArray

如何使用自定义对象 XCTAssertEqual NSArray?

如何将自定义对象的 NSArray 归档到 Objective-C 中的文件

如何使用自定义 UICollectionReusableView 作为集合视图的部分标题?

从 NSArray 创建自定义无序列表