2012-06-09 122 views
12

我想弄清楚除了動態單元格(我認爲)之外還有幾個靜態單元格,但是當我啓動一個新的主從應用程序並將默認動態原型切換到靜態單元,它崩潰。關於靜態單元格vs動態單元格的困惑

我想,因爲我仍然是新手,我不明白所有組件(表格視圖,單元格,代表)是如何連線的。我切換到靜態單元格後,我製作了三個單元格,但沒有顯示出來。該應用只是崩潰。

我可以包括代碼,但基本上,我創建一個新的主 - 細節,切換到靜態單元格,更改三個單元的名稱,它崩潰(在主循環中)。

謝謝你的一切。

+0

你能分享堆棧跟蹤嗎? – sosborn

回答

45

如果我明白你的問題,這是你正在尋找的解釋:

原型(重用):

當您使用動態細胞,您使用原型細胞。這意味着無論是在IB還是在您的代碼中,您都會創建一個UITableViewCell的實例,併爲其指定一個標識符(reuseIdentifier)。 UITableView使用此原型根據需要生成儘可能多的單元(行)。 UITableView創建(並使用內存)爲儘可能多的單元格,因爲它需要填充屏幕。一旦其中一些細胞熄滅屏幕,UITableView重用他們 - 回收他們。

您可以定義一個UITableView超過一個原型細胞。這個想法是每個原型都有不同的用途。例如,您可以定義一個原型單元格,它只有一個大的UILabel,其目的是使用靜態文本。您可以定義另一個只有一個UIImageView的原型。這取決於您的設計以及您希望如何顯示數據。

要使用的原型細胞,在IB,您使用動態原型細胞,並設置identifier。然後,你必須實現UITableViewDataSource方法,如:

– tableView:numberOfRowsInSection: 
– tableView:cellForRowAtIndexPath: 

這些方法的UITableView的委託方法。

如果不使用IB,你會在– tableView:cellForRowAtIndexPath:方法創建細胞:

的UITableViewCell *細胞= [[ALLOC的UITableViewCell] initWithStyle:(UITableViewCellStyle)樣式reuseIdentifier:(的NSString *)reuseIdentifier];

靜態:

靜態細胞的想法只是簡單。例如,您可以使用原型單元格(例如,只有一個原型)並輸入靜態NSArray作爲數據源。爲了執行UITableViewDataSource方法的任務,Apple引入了靜態單元格,您只能使用故事板和IB。在IB中,選擇表格視圖,然後選擇靜態單元格改爲,然後鍵入文字或設置圖像。 您不希望在應用程序運行後對靜態單元格進行任何動態更改,因爲它並不適用於您,因此您將不得不實施更多不值得的方法。儘管獲取所選行的indexPath並不是什麼大事,但是想法是如果您需要從選擇靜態單元中推送新視圖,則可以使用segues而不是實現任何代碼。

當使用靜態單元格時,您不應該實現UITableViewDataSource方法,否則您的應用程序會崩潰,反之亦然,如果您在使用原型單元格時未實現UITableViewDataSource方法(必需的),那麼您的應用程序會崩潰。

+0

我打算用一個精細的梳子(你是爲此寫的?還是你找到它的地方?),但擺脫UITableViewDataSource方法做了竅門(不得不添加「numberOfRowsInSection」。 –

+2

很高興它的工作原理雖然你可以在這裏找到更多的解釋,祝你好運! – Canopus

+0

我從所有這些知識中學到了一件好事,那就是類參考文檔(組織者 - 文檔)中有大量的文檔。我會在發佈之前閱讀所有適用的類參考文檔 –