使用 swift 4 以编程方式注册时未显示自定义单元格

Posted

技术标签:

【中文标题】使用 swift 4 以编程方式注册时未显示自定义单元格【英文标题】:Custom cell isn't showing up when registered programatically with swift 4 【发布时间】:2018-07-08 14:03:33 【问题描述】:

新手尝试使用 swift 和 Cocoa Touch 学习编程概念

所以,我曾经自定义 CategoryCell: UICollectionViewCell

class CategoryCell: UICollectionViewCell 
    override init(frame: CGRect) 
        super.init(frame: frame)
        setupView()
    

    required init?(coder aDecoder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    

    func setupView() 
        print("set background Color")
        backgroundColor = UIColor.black
    


与一个以编程方式创建的 UICollectionView 配对

class FeaturedAppsController: UICollectionViewController, UICollectionViewDelegateFlowLayout 

    private let cellID = "cellID"
    private let featuredApps = "Featured Apps"

    override func viewDidLoad() 
        super.viewDidLoad()
        navigationItem.title = featuredApps
        collectionView?.backgroundColor = UIColor.yellow
        collectionView?.register(CategoryCell.self, forCellWithReuseIdentifier: cellID)
    


    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
        return 4
    


    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellID , for: indexPath) as! CategoryCell
        print("Cell created")
        return cell
    


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

App下的代码

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool 

    window = UIWindow(frame: UIScreen.main.bounds)
    window?.makeKeyAndVisible()
    let layout = UICollectionViewLayout()
    let featuredAppsController = FeaturedAppsController(collectionViewLayout: layout)
    window?.rootViewController = UINavigationController(rootViewController: featuredAppsController)

    return true

我已经在 viewDidLoad();

中注册了自定义单元格

另外,我让它的 width 等于 视图的宽度。 但它向我展示的只是黄色的 UICollectionView,就是这样????????‍♂️

【问题讨论】:

是否打印在 consol 中创建的单元格? 您正在为您的单元格使用 nib 文件? @hardikdevios ????它没有。很奇怪,对吧? 你设置了代表吗? @SandeepBansal 您是否在 Storyboard 中设置了 FeaturedAppsController?在Identity inspector. 【参考方案1】:

试试这个。你错过了一些代码。你应该有

 @IBOutlet weak var collectionView: UICollectionView!

你也错过了这个数据源和collectionView的代表

collectionView.dataSource = self
collectionView.delegate = self

这是完整的代码。

import UIKit

class ViewController: UIViewController,UICollectionViewDelegate,UICollectionViewDataSource 



    @IBOutlet weak var collectionView: UICollectionView!

    override func viewDidLoad() 
        super.viewDidLoad()
        collectionView.dataSource = self
        collectionView.delegate = self
        // Do any additional setup after loading the view, typically from a nib.
    

     func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
        return 4
    

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CollectionViewCell
        print("Cell created")
        return cell
    


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





试试这个,让我知道。

【讨论】:

今晚会这样做 好的,当然:)如果正确请标记为正确答案 成功了?。虽然,由于我没有使用 Interface builder,但我不需要编写 @IBOutlet。另外,由于我使用的是 UICollectionViewController,我实际上并不需要继承 ViewController。我所需要的只是 collection View.dataSource = self collectionView.delegate = self 很高兴我能帮助你兄弟:)【参考方案2】:

创建您的 xib 文件,然后将您的单元格注册到集合视图

//Register cell
let cellNIB = UINib(nibName: "YourCollectionViewXibName", bundle: nil)
collectionView.register(cellNIB, forCellWithReuseIdentifier: cellID)

【讨论】:

@Steven0351 但我们都从他没有以编程方式执行的代码中知道:-p【参考方案3】:

如果都是程序化的,那么用这样的布局初始化它

let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
let featuredAppsController = FeaturedAppsController(collectionViewLayout: layout) 
window?.rootViewController = UINavigationController(rootViewController: featuredAppsController) 

【讨论】:

您能说得更具体些吗?我应该把这段代码放在哪里? 把这段代码放在你展示这个VC的地方还是根? 这里是新手。我不知道你在说什么,抱歉。 如果没有情节提要的起点,在哪里使用这个类,如何显示它,或者它是否神奇地显示出来!!!!,你使用self.window。 AppDelagate.swiftdidFinishLaunchingWithOptions 方法中的 rootViewController window?.rootViewController = UINavigationController(rootViewController: featuresAppsController) 这是在 AppDelegate 的 didFinishLaunchingWithOptions 方法下,如果有帮助的话【参考方案4】:

您正在使用 UICollectionViewLayout()

你应该使用:

let layout = UICollectionViewFlowLayout()

【讨论】:

以上是关于使用 swift 4 以编程方式注册时未显示自定义单元格的主要内容,如果未能解决你的问题,请参考以下文章

使用 Swift 以编程方式自定义 UITableViewCell

如何在 Swift 4 中以编程方式注册 UITableViewHeaderFooterView?

以编程方式添加到 collectionviewcell 时未启用按钮

如何在 Swift 中以编程方式从 UIView 中删除安全区域?

使用自定义初始化程序 swift 以编程方式实例化和推送视图控制器

如何以编程方式将自定义 uiview 添加到视图控制器 SWIFT