UICollectionReusableView 中的标签始终为零

Posted

技术标签:

【中文标题】UICollectionReusableView 中的标签始终为零【英文标题】:Label in UICollectionReusableView always nil 【发布时间】:2016-08-31 12:16:49 【问题描述】:

正如标题所述,我在 UICollectionReusableView 中有一个标签。我使用的视图使用以下方法成功出列:

func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView 
        let hourCell = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier:"Hour", forIndexPath: indexPath) as! HourCollectionReuseableView;
        let time = String(indexPath.item) + "H";
        hourCell.setTime(time);
        return hourCell;
    

这是HourCollectionReuseableView 的界面构建器视图。我在这里注意到我在文件所有者的自定义类中执行此操作:

这里是集合重用标识符:

这是HourCollectionReuseableView 类:

class HourCollectionReuseableView: UICollectionReusableView 

    @IBOutlet weak var hourLabel: UILabel!
    @IBOutlet weak var hourDividerLine: UIView!

    override func awakeFromNib() 
        super.awakeFromNib();
    

    func setTime(time:String) 
        self.hourLabel.text = time;
    

在我的视图控制器中,我按如下方式注册类:

override func viewDidLoad() 
        super.viewDidLoad();
        self.collectionView.registerClass(HourCollectionReuseableView.self, forSupplementaryViewOfKind: "Hour", withReuseIdentifier:"Hour");
    

代码在self.hourLabel.text = time 上不断崩溃,并出现以下错误:

致命错误:在展开可选值时意外发现 nil

我哪里错了?

【问题讨论】:

在这里你得到输出 let time = String(indexPath.item) + "H";与否 检查您的hourLabel 是否与视图连接? 您在使用情节提要时无需注册您的手机。还要检查您没有为标签分配任何nil 值。崩溃是因为空值赋值。 您可以尝试使用 registerNib 代替 registerClass。例如self.collectionView.registerNib(UINib(nibName: "HourCollectionReuseableView", bundle: nil), forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "Hour") 从 viewdidload 中删除注册类 【参考方案1】:

正如@firstinq 指出的那样,当您在HourCollectionReuseableView 中使用.xib 时,您应该尝试使用registerNib 而不是registerClass

所以,你的代码应该看起来更像

override func viewDidLoad() 
    super.viewDidLoad();
    self.collectionView.registerNib(UINib(nibName: "HourCollectionReuseableView", bundle: nil), forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "Hour");

【讨论】:

以上是关于UICollectionReusableView 中的标签始终为零的主要内容,如果未能解决你的问题,请参考以下文章

Swift - UICollectionReusableView 的子视图不适合宽度

未显示自定义 UICollectionReusableView 元素

显示部分标题 UICollectionReusableView

UICollectionReusableView 中未调用委托

协议和委托不适用于 UICollectionReusableView

UICollectionReusableView 中的标签始终为零