【问题标题】:cellForItemAt function not getting called at UICollectionViewController in Swift 4Swift 4 中的 UICollectionViewController 未调用 cellForItemAt 函数
【发布时间】:2019-01-25 11:12:36
【问题描述】:

这似乎很基本,但我无法在 Swift 4 中使用它。

所以我有以下 UICollectionViewController 的实现

class TestController: UICollectionViewController, UICollectionViewDelegateFlowLayout {

    override func viewDidLoad() {
        super.viewDidLoad()

        collectionView?.register(MyCell.self, forCellWithReuseIdentifier: "default")
    }

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        return collectionView.dequeueReusableCell(withReuseIdentifier: "default", for: indexPath)
    }

    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 2
    }


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

虽然... numberOfItems ... 方法被调用,但... cellForItemAt indexPath ... 的方法没有被调用。

我错过了什么?

这是单元格的代码

class MyCell: UICollectionViewCell {
    override init(frame: CGRect) {
        super.init(frame: frame)
        backgroundColor = .green
    }

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

另外,我没有使用故事板,所以我在AppDelegate 类中按如下方式实例化此控制器:

...
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        window = UIWindow()
        window?.makeKeyAndVisible()

        window?.rootViewController = UINavigationController(rootViewController: TestController(collectionViewLayout: .init()))

        return true
    }
...

【问题讨论】:

    标签: ios swift uicollectionview swift4 uicollectionviewdelegate


    【解决方案1】:

    代替

    window?.rootViewController = UINavigationController(rootViewController: TestController(collectionViewLayout: .init()))
    

    在 didFinishLaunchingWithOptions 方法中使用这个

     window?.rootViewController = UINavigationController(rootViewController: TestController(collectionViewLayout: UICollectionViewFlowLayout()))
    

    【讨论】:

    • 因为该语法而损失了一整天...使用命名构造函数和.init() 有什么区别?
    • 命名构造函数创建 TestController 对象以及定义布局类型。而默认构造函数只创建 TestController 类的对象。集合视图指定布局类型的基本要求。如果您使用的是默认构造函数,那么您可以在 viewDidLoad 中设置布局类型。例如self.collectionView?.collectionViewLayout = UICollectionViewFlowLayout()。如果我的回答解决了你的问题,请投票... :)
    • 虽然你的回答帮助我解决了我的问题,但我认为问题依赖于其他地方......参数 collectionViewLayout 需要一个类型 UICollectionViewLayout 所以使用 .init() 创建了该对象的实例而不是UICollectionViewFlowLayout,这是使它工作的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多