使用 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.swift 的 didFinishLaunchingWithOptions 方法中的 rootViewController window?.rootViewController = UINavigationController(rootViewController: featuresAppsController) 这是在 AppDelegate 的 didFinishLaunchingWithOptions 方法下,如果有帮助的话【参考方案4】:您正在使用 UICollectionViewLayout()
你应该使用:
let layout = UICollectionViewFlowLayout()
【讨论】:
以上是关于使用 swift 4 以编程方式注册时未显示自定义单元格的主要内容,如果未能解决你的问题,请参考以下文章
使用 Swift 以编程方式自定义 UITableViewCell
如何在 Swift 4 中以编程方式注册 UITableViewHeaderFooterView?
以编程方式添加到 collectionviewcell 时未启用按钮
如何在 Swift 中以编程方式从 UIView 中删除安全区域?