我有一个带有UICollectionView的ViewController,我想在其中显示用户朋友列表中玩家的前两个字母,如下所示:

func collectionView(collectionView: UICollectionView,
    cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

        contactListCollection.registerClass(PlayerCell.self, forCellWithReuseIdentifier: "PlayerCell")

        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("PlayerCell", forIndexPath: indexPath) as! PlayerCell

        let contacts = contactList.getContactList() //Array of strings

        for(var i = 0; i < contacts.count; i++){

            var str = contacts[i]
            // First two letters
            let firstTwo = Range(start: str.startIndex,
                end: str.startIndex.advancedBy(2))

            str = str.substringWithRange(firstTwo)

            cell.setButtonTitle(str);
        }


        return cell;
}

func collectionView(collectionView: UICollectionView,
  numberOfItemsInSection section: Int) -> Int {

    return contactList.getContactList().count;
}


我的PlayerCell类如下:

   class PlayerCell : UICollectionViewCell {

   @IBOutlet var button: UIButton?

   func setButtonTitle(text: String){
     button!.setTitle(text, forState: .Normal)
   }
}


运行代码时,它给出:
致命错误:解开Optional值时意外发现nil

我发现PlayerCell中的按钮为nil

我在情节提要中的单元格内添加了按钮,并将这些按钮与参考插座相连

我在这里想念什么吗?

在Swift 2.0中使用xCode 7

最佳答案

作为编译过程的一部分,Xcode将情节提要转换为XIB文件的集合。这些XIB文件之一包含您的单元格设计。

当您的应用加载在情节提要中设计的集合视图控制器时,该控制器将为该单元注册该单元的XIB文件。

您正在通过调用registerClass(_:forCellWithReuseIdentifier:),切断“ PlayerCell”重用标识符和包含PlayerCell设计的XIB之间的连接,来覆盖该注册。

摆脱这一行:

contactListCollection.registerClass(PlayerCell.self, forCellWithReuseIdentifier: "PlayerCell")


另外,请确保在情节提要中已将单元的重用标识符设置为“ PlayerCell”。

09-17 05:15