未应用 nib 约束的集合视图单元格

Posted

技术标签:

【中文标题】未应用 nib 约束的集合视图单元格【英文标题】:Collection view cell from nib constrains not applied 【发布时间】:2017-07-02 16:15:21 【问题描述】:

我在 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() 函数相关的特定问题。当集合视图尝试为单元格获取数据时,它没有完成并且数据源为空。结果 - 什么都没有出现。

【问题讨论】:

【参考方案1】:

确保在从您的网络服务或您认为最适合的任何地方获取数据后,在 viewWillAppear 或类似的东西上调用 reloadData。

来自 Apple 文档 - UICollectionView 或 UITableView 上的 reloadData:

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

所以它基本上调用了那些协议函数。

【讨论】:

我正在做。也许问题是因为我在另一个collectionViewCell 中使用了collectionView,并将其实例化为lazy var 更改段时调用什么函数?请在问题中发布代码sn-p

以上是关于未应用 nib 约束的集合视图单元格的主要内容,如果未能解决你的问题,请参考以下文章

iOS UICollectionView 动态切换单元格NIB

另一个集合视图中集合视图单元格的约束

如何更改集合视图锡约束中单元格的位置?

UICollectionView,来自注册为单元格的框架目标的 nib 在运行时失败

图像未显示在集合视图单元格中

向其子视图(即 UILabel)添加约束时,无法保持集合视图单元格的固定大小