iOS - 未应用我的 UICollectionViewCell 上的自定义

Posted

技术标签:

【中文标题】iOS - 未应用我的 UICollectionViewCell 上的自定义【英文标题】:iOS - Customisations on my UICollectionViewCell are not applied 【发布时间】:2020-01-28 13:53:33 【问题描述】:

我正在使用多个水平 UICollectionView 编写 ios 应用程序,这些 UICollectionView 堆叠在 ScrollView 内的 StackLayout 中。我想在这些集合视图中显示图像,但我的自定义 UICollectionViewCell 没有显示任何内容。

Here is what I'm doing

我关注了this tutorial 的多个集合视图,以及this one 的自定义单元格。

这是我的视图控制器:

import UIKit

struct CustomImage 
    var title: String
    var image: UIImage


class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout 

@IBOutlet weak var perspectiveCV: UICollectionView!
@IBOutlet weak var monkeyCV: UICollectionView!
@IBOutlet weak var beachCV: UICollectionView!

let perspectiveImages = [
    CustomImage(title: "Perspective 1", image: #imageLiteral(resourceName: "perspective-1")),
    CustomImage(title: "Perspective 2", image: #imageLiteral(resourceName: "perspective-2")),
    CustomImage(title: "Perspective 3", image: #imageLiteral(resourceName: "perspective-3")),
    CustomImage(title: "Perspective 4", image: #imageLiteral(resourceName: "perspective-4")),
    CustomImage(title: "Perspective 5", image: #imageLiteral(resourceName: "perspective-5")),
    CustomImage(title: "Perspective 6", image: #imageLiteral(resourceName: "perspective-6"))
]

let monkeyImages = [
    CustomImage(title: "Monkey 1", image: #imageLiteral(resourceName: "monkey-1")),
    CustomImage(title: "Monkey 1", image: #imageLiteral(resourceName: "monkey-2")),
    CustomImage(title: "Monkey 1", image: #imageLiteral(resourceName: "monkey-3"))
]

let beachImages = [
    CustomImage(title: "Beach 1", image: #imageLiteral(resourceName: "beach-1")),
    CustomImage(title: "Beach 2", image: #imageLiteral(resourceName: "beach-2")),
    CustomImage(title: "Beach 3", image: #imageLiteral(resourceName: "beach-3")),
    CustomImage(title: "Beach 4", image: #imageLiteral(resourceName: "beach-4"))
]

override func viewDidLoad() 
    super.viewDidLoad()
    title = "Images"

    setupCollectionViews()


fileprivate func setupCollectionViews() 
    // Heights
    perspectiveCV.heightAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.8).isActive = true
    monkeyCV.heightAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.8).isActive = true
    beachCV.heightAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.8).isActive = true

    // Left and right padding
    perspectiveCV.contentInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)
    monkeyCV.contentInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)
    beachCV.contentInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)

    // Hide scrolling indicator
    perspectiveCV.showsHorizontalScrollIndicator = false
    monkeyCV.showsHorizontalScrollIndicator = false
    beachCV.showsHorizontalScrollIndicator = false


func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
    switch collectionView 
    case monkeyCV:
        return monkeyImages.count
    case beachCV:
        return beachImages.count
    default:
        return perspectiveImages.count
    


func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
    switch collectionView 
    case monkeyCV:
        let monkeyCell = monkeyCV.dequeueReusableCell(withReuseIdentifier: "monkeyCell", for: indexPath) as! ImageCollectionViewCell
        monkeyCell.backgroundColor = UIColor.systemOrange
        monkeyCell.data = monkeyImages[indexPath.row]
        return monkeyCell
    case beachCV:
        let beachCell = beachCV.dequeueReusableCell(withReuseIdentifier: "beachCell", for: indexPath) as! ImageCollectionViewCell
        beachCell.backgroundColor = UIColor.systemBlue
        beachCell.data = beachImages[indexPath.row]
        return beachCell
    default:
        let perspectiveCell = perspectiveCV.dequeueReusableCell(withReuseIdentifier: "perspectiveCell", for: indexPath) as! ImageCollectionViewCell
        perspectiveCell.backgroundColor = UIColor.systemRed
        perspectiveCell.data = perspectiveImages[indexPath.row]
        return perspectiveCell
    


func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize 
    return CGSize(width: collectionView.frame.width * 0.8, height: collectionView.frame.width * 0.8)



这是我的自定义 UICollectionViewCell :

import UIKit

class ImageCollectionViewCell: UICollectionViewCell 

var data: CustomImage? 
    didSet 
        guard let data = data else  return 
        bg.image = data.image
    


fileprivate let bg: UIImageView = 
    let iv = UIImageView()
    iv.translatesAutoresizingMaskIntoConstraints = false
    iv.contentMode = .scaleAspectFit
    iv.clipsToBounds = true
    return iv
()

override init(frame: CGRect) 
    super.init(frame: frame)

    bg.topAnchor.constraint(equalTo: contentView.topAnchor).isActive = true
    bg.leadingAnchor.constraint(equalTo: contentView.leadingAnchor).isActive = true
    bg.trailingAnchor.constraint(equalTo: contentView.trailingAnchor).isActive = true
    bg.bottomAnchor.constraint(equalTo: contentView.bottomAnchor).isActive = true

    contentView.addSubview(bg)


required init?(coder: NSCoder) 
    super.init(coder: coder)


And here is my Storyboard

你能解释一下我的代码有什么问题吗?

我的设置:

Swift 版本:5.1.3 Xcode 版本:11.3.1 目标 iOS 版本:13.2 MacBook Pro(13 英寸,2016 年,四个 Thunderbolt 3 端口)MacOS Catalina 10.15.2 (19C57)

【问题讨论】:

您是否将自定义单元格应用于您的 UICollectionViewCell ?在你的故事板中? @JulianSilvestri 在情节提要中是的,通过单击单元格,在右侧检查器中,我已将自定义类设置为 ImageCollectionViewCell。 在您的故事板中,您有三个collectionView。每个人都有自己的细胞。这些单元中的每一个都需要应用于您的自定义单元类。你这样做了吗? @JulianSilvestri 我已将自定义单元格类设置为我的 ImageCollectionViewCell,从情节提要(在右侧检查器中单击一个单元格),用于三个单元格中的每一个。这是你要求的吗? @JulianSilvestri 是否可以将其与“UICollectionViewDelegateFlowLayout”链接:我第一次使用它,第一次遇到问题。我不明白怎么可能被困在看起来那么容易的事情上.. 【参考方案1】:

您似乎尚未建立分配给每个集合视图的委托/数据源。

在您的视图中,确实加载将委托和数据源连接到您的每个集合视图。

self.mycollectionView1.delegate = self
self.mycollectionView1.datasource = self
self.mycollectionView2.delegate = self
self.mycollectionView2.datasource = self
self.mycollectionView3.delegate = self
self.mycollectionView3.datasource = self

您还可以通过情节提要设置委托和数据源。 您可以选择每个 collectionView 并 ctrl + 拖动到您的 ViewController 而不是视图!

请注意上图中突出显示的部分。 这表明您的 viewController。 Ctrl + 将每个集合视图拖动到该点并单击委托和数据源

编辑-----

而不是像您在这里所做的那样使用 switch 语句

switch collectionView 
    case monkeyCV:
        let monkeyCell = monkeyCV.dequeueReusableCell(withReuseIdentifier: "monkeyCell", for: indexPath) as! ImageCollectionViewCell
        monkeyCell.backgroundColor = UIColor.systemOrange
        monkeyCell.data = monkeyImages[indexPath.row]
        return monkeyCell
    case beachCV:
        let beachCell = beachCV.dequeueReusableCell(withReuseIdentifier: "beachCell", for: indexPath) as! ImageCollectionViewCell
        beachCell.backgroundColor = UIColor.systemBlue
        beachCell.data = beachImages[indexPath.row]
        return beachCell
    default:
        let perspectiveCell = perspectiveCV.dequeueReusableCell(withReuseIdentifier: "perspectiveCell", for: indexPath) as! ImageCollectionViewCell
        perspectiveCell.backgroundColor = UIColor.systemRed
        perspectiveCell.data = perspectiveImages[indexPath.row]
        return perspectiveCell
    

试着像这样建立你的细胞

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath)-> UICollectionViewCell 
      let cell = myCollectionView1.dequeueResuableCell(withReuseIdentifier: "myIdentifier", for: indexPath) as! mycustomCellClass
      cell.backgroundColor = UIColor.systemOrange
      return cell


      if collectionView == mycollectionView2 
          let cell2 = mycollectionView2.dequeueResuableCell(withReuseIdentifier: "myIdentifier2", for: indexPath) as! mycustomCellClass
          cell2.backgroundColor = UIColor.systemBlue
      


等等。 您可能还需要修改您的 numberOfItemsInSection 函数以替换该 switch 语句。

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
    switch collectionView 
    case monkeyCV:
        return monkeyImages.count
    case beachCV:
        return beachImages.count
    default:
        return perspectiveImages.count
    

从上面改为下面

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
     if (collectionView == mycollectionView1  
        return monkeyImages.count
      else if (collectionView == myCollectionView2 
        return beachImages.count
      else 
       //this is your final collectionview 
       return persepctiveImages.count
     

编辑 2-----------

尝试删除 sizeForItemAt

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize 
    return CGSize(width: collectionView.frame.width * 0.8, height: collectionView.frame.width * 0.8)

转到您的情节提要并以物理方式拖动单元格的大小。在尺寸检查器的右侧面板上,确保“估计尺寸”选项设置为无。

你也可以试试这个。

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize 
    return CGSize(width: (collectionView.frame.size.width/3), height: collectionView.frame.size.height)

除以 3 得到三个单元格。

【讨论】:

我已经从 StoryBoard 中完成了。我通过将 CollectionViews 拖到 viewController 并检查了委托和数据源再次进行了检查。毫无疑问,我也做了你在 ViewDidLoad 中告诉我的事情,但没有任何改变。如果有帮助的话,我可以将项目存档发送到这里。 我正在阅读您更新的答案,但我看不出有任何区别,因为“if/else”和“switch/case”的工作方式几乎相同。我尝试使用“if/else”语句,但结果是一样的

以上是关于iOS - 未应用我的 UICollectionViewCell 上的自定义的主要内容,如果未能解决你的问题,请参考以下文章

Twitter登录未在我的ios应用程序中打开登录窗口

启动图像未显示在我的 iOS 应用程序中

如何在 iOS 中动态更改 UICollectionView 单元格高度

iphone ios 7 主屏幕掩码未正确应用于我的图标

ios 应用程序图标未显示并且名称丢失为啥?

cloudkit 数据未显示在提交的应用程序 iOS 8.1 中