2017-01-22 71 views
2

我來自Obj-C,我很努力地在Swift中做一些超級基本的東西!Swift - Subclassed UICollectionViewCell無法加載IBOutlet屬性

我有一個自定義UICollectionViewCell

class CustomCell: UICollectionViewCell 
{ 
    // Outlets 
    // *************************** 

    @IBOutlet weak var button: UIButton! 

    // Init 
    // *************************** 

    required init?(coder aDecoder: NSCoder) 
    { 
     super.init(coder:aDecoder) 

     setup() 
    } 

    override init(frame: CGRect) 
    { 
     super.init(frame: frame) 

     setup() 
    } 

    func setup() 
    { 
     button.backgroundColor = .white 
    } 
} 

細胞來自外部的.xib文件中加載,所以init(coder:)被調用初始化,但我的按鈕還沒有準備好。

如果我更改爲button?.backgroundColor該應用程序不會崩潰,但顯然沒有發生任何事情。

我可以在layoutSubviews()中調用我的setup()函數,它可以工作,但它絕對不是正確的地方。

如何解決這個大問題?笑

編輯

可能是我打電話給setup()awakeFromNib(),對不對? 我通常不使用外部.xib,我不熟悉它們

回答

1

編輯:對不起你似乎在我的答案之前編輯了你的問題,好像你從XIB加載它,然後你可以運行awakeFromNib這將被稱爲當你使用此方法註冊一個筆尖

Apple Source UICollectionView

Apple Source UITableView

---以下舊文章---

在Xcode 6中,您必須在 類(如RDCell,它是UICollectionViewCell的子類)中提供額外的init(編碼器:)初始化程序。 當類獲取從故事板或xib文件初始化的 時,此初始化程序被調用而不是init(框架:)。這不是我們的情況,但 我們仍然需要提供init(coder :)。我們可以使用Xcode提供給我們的解決方案 。在問題導航點擊該 說,一個錯誤「‘必要’初始化‘的init(編碼器:)’必須由 子‘UICollectionViewCell’來提供」,

Source

+0

是啊,我剛剛意識到,星期一早上該死! :)謝謝 –

+0

@JacopoPenzo我感覺你! :) np man,GL,順便說一句,如果你有相同的重用標識符,只在VC的「viewDidLoad」中註冊一次,否則你需要爲每個唯一標識符註冊一次。 – 2017-01-23 00:14:07

+0

我正在使用'IGListKit',所以沒有註冊登記:) –