繁体   English   中英

来自笔尖约束的集合视图单元格未应用

[英]Collection view cell from nib constrains not applied

我有在IB中构造的collectionViewCell 设置了所有约束,但是当集合视图加载像元时,其尺寸默认为50x50。

这是我的手机:

在此处输入图片说明

另一个有趣的时刻,如果我像这样为集合视图设置布局属性:

layout.estimatedItemSize = UICollectionViewFlowLayoutAutomaticSize

它可以正确布置单元格,但仅在重新加载后才能布置。

在此处输入图片说明

如您所见,向左滑动后没有任何显示,但是在拉动并刷新单元格之后出现。 为什么单元格在滑动并加载数据后没有出现? 我发现没有调用诸如numberOfItemsInSectionwillDisplaycellForItemAt类的数据源功能。 刷新后称为一个。

这两个屏幕(左和右)是水平集合视图的单元格。 在第二个单元格中,我有另一个集合视图。 在第二个单元格内,我实例化集合,如下所示:

lazy var collectionView: UICollectionView = {
    let layout = UICollectionViewFlowLayout()
    layout.estimatedItemSize = UICollectionViewFlowLayoutAutomaticSize
    let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
    collectionView.backgroundColor = UIColor.clear
    collectionView.alwaysBounceVertical = true
    return collectionView
}()
...
override func setupViews() {
    super.setupViews()

    let nib = UINib(nibName: String(describing: WorkoutSectionCollectionViewCell.self), bundle: nil)
    collectionView.register(nib, forCellWithReuseIdentifier: String(describing: WorkoutSectionCollectionViewCell.self))
    collectionView.dataSource = self
    collectionView.delegate = self

    fetchMyWorkouts()
    collectionView.reloadData()
}

fetchMyWorkouts函数通过REST Api从后端检索数据:

func fetchMyWorkouts() {
    self.activityIndicatorView.startAnimating()
    Synchronizer.sharedInstance.syncNewWorkout { (_, error) in
        if error != nil {
            let message = Murmur(title: error!.localizedDescription, backgroundColor: Colors.colorWhite, titleColor: Colors.colorCadmiumOrange, font: UIFont(name: "OpenSans", size: 10)!, action: nil)
            Whisper.show(whistle: message, action: .show(5))
        } else {
            RestApi.sharedInstance.fetchData(withRequest: .getWorkouts, entityNamed: .workout) { _ in
                DispatchQueue(label: "", qos: .background).async {
                    let requestMyWorkouts = NSFetchRequest<NSFetchRequestResult>(entityName: "Workout")
                    requestMyWorkouts.predicate = NSPredicate(format: "createdBy == %@", USERID)
                    do {
                        self.myWorkouts = try dataStack.mainContext.fetch(requestMyWorkouts) as! [Workout]
                    } catch {
                        fatalError("Failed to fetch workouts: \(error)")
                    }

                    DispatchQueue.main.async(execute: {
                        self.placeholderStackView.isHidden = (self.myWorkouts.count == 0) ? false : true
                        self.collectionView.reloadData()
                        self.activityIndicatorView.stopAnimating()
                    })
                }
            }
        }
    }
}

更新 :这是链接到fetchMyWorkouts()函数的特定问题。 当集合视图试图获取单元格的数据时,它没有完成并且数据源为空。 结果-什么也没出现。

从网络服务或您认为最适合的任何位置获取数据后,请确保在viewWillAppear或类似的名称上调用reloadData。

从Apple文档-UICollectionView或UITableView上的reloadData:

需要重新加载集合视图中的所有项目时,请谨慎地调用此方法。 这将导致集合视图丢弃任何当前可见的项目(包括占位符),并根据数据源对象的当前状态重新创建项目。

因此,它基本上调用了那些协议功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM