算是蓄謀已久了,開辟了這么一個文集。在這里說說在我開發(fā)時遇到的那些坑,有些可能是因為本人經驗不足,有些確實是蘋果或者其他第三方制造的坑。我會將這些坑拿出來一一盤點,如果能讓碼友們避免一些不必要的時間浪費,那我會非常開心。
注,對應環(huán)境版本:
Xcode Version 6.4 (6E35b)
System Version Yosemite 10.10.4 (14E46)
在講這個問題之前我非常努力的壓抑住了我的怒火。因為,這個坑,真的很隱蔽。
先介紹一下碰到問題的原因,由于我目前的工作需要對UITableViewCell自定義側滑樣式,所以很容易的想到了之前用過的一個開源控件SWTableViewCell。由于之前使用SWTableViewCell是配合Xib進行視圖編輯,所以并沒有碰到今天所要說的問題。這次使用該控件是配合Storyboard。那么問題來了,坑在哪里?
當我使用SWTableViewCell的時候,我自定義了一個類,繼承自SWTableViewCell,然后Storyboard中的Cell繼承自SWTableViewCell。當我拖拽好了所需要布局的控件,調整好尺寸,編譯、運行之后Xcode報給我一些運行時的錯誤,如下:

從上圖中我能提取到的信息就是SWTableViewCell類庫中有一些約束的問題,但是當我運行SWTableViewCell的demo之后發(fā)現(xiàn)沒有任何報錯。那筆者這時認為問題可能出現(xiàn)在我自己的約束上。于是,筆者一個一個把自己的控件刪除,不斷嘗試直到刪掉了所有我創(chuàng)建的控件。但是,仍然會報錯。這時,筆者的精神就不太正常了。WHY?。。?/p>
接著,我嘗試重新創(chuàng)建了一個工程,剝離其他影響,只寫一個繼承自SWTableViewCell的類,然后用Storyboard控件繼承,除此之外,并沒有添加任何其他的東西。然后我驚訝的發(fā)現(xiàn),還是報錯?。。?!這時,我就不得不懷疑SWTableViewCell的作者是不是在demo的工程中做了什么手腳,于是我將demo工程的多余信息全部刪除僅剩下和我測試工程一樣的信息,編譯,發(fā)現(xiàn),demo的工程仍然沒有問題,我新建的測試工程還是有問題。于是,再次縮小范圍,我將demo的Storyboard中的Controller復制到我的工程下,替換掉我原有的Controller,然后發(fā)現(xiàn)報錯不見了。再次用同樣的方法縮小范圍,直到縮小到我將demo的Storyboard中的TableViewCell復制到我的工程的TableView中替換我原有的Cell,然后發(fā)現(xiàn)報錯消失了。到此位置,我已經將范圍縮到最小,證明了問題一定出在TableViewCell中。于是我再次仔細的檢查了一下兩邊TableViewCell的所有屬性,發(fā)現(xiàn)所有的屬性都一樣。這特么太奇怪了。。。同樣的環(huán)境,同樣的工程,同樣的控件,為什么一個會報錯,一個不會報錯。
于是,我上了個廁所。。。。
回來后,重新整理了一下思路,理順了一下流程,都沒有什么問題。那么唯一有可能出現(xiàn)問題的地方就是Storyboard的源碼了。于是我打開了Storyboard的源碼,打開了TableViewCell相應的位置,對比之后發(fā)現(xiàn),問題果然出現(xiàn)在這里。
demo的源碼信息:

我的源碼信息:

對比后會發(fā)現(xiàn)兩者的區(qū)別差在這一行:
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
也就是,我在Storyboard中創(chuàng)建的TableViewCell少了這一樣,于是我將demo中的這一行復制到我的工程中,編譯,運行。It works!
由此可知,這個問題可能是Interface Builder的一個bug。由于我之前是通過點擊下圖中的面板來創(chuàng)建的TableViewCell

所以,我換了一種方式,從控件區(qū)拖拽UITableViewCell到Storyboard中的TableView上,再次檢查源碼,發(fā)現(xiàn),通過控件區(qū)拖拽創(chuàng)建的UITableViewCell是有上面這一行代碼的。至此,這個坑已經闡述完畢了!
結論:在Storyboard中,通過點擊UITableView的設置面板增加cell數(shù)量創(chuàng)建的UITableViewCell實際上是不完整的,少了frame的信息,但是通過拖拽控件區(qū)中的控件到視圖中創(chuàng)建UITableViewCell,Storyboard的源碼信息是完成的,所以,希望看到本文的小伙伴們盡量使用拖拽控件區(qū)控件來創(chuàng)建UITableViewCell,以避免不必要的麻煩。
感謝閱讀
下期再見