2014-11-02 70 views
1

我知道這個問題已經被回答過了,但是我對收到的代碼審查有點困惑。我建立了一個定製的細胞電話OpeningsTableViewCell,併爲細胞定製了xib。在我 cellForRowAtIndexPath方法我的代碼如下:自定義TableView單元重用代碼審查問題

static NSString *reuseIdentifier = @"OpeningsTableViewCell"; 
OpeningsTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier]; 
if (cell == nil) { 
    cell = (OpeningsTableViewCell *)[[[NSBundle mainBundle] loadNibNamed:reuseIdentifier owner:nil 
                  options:nil] objectAtIndex:0]; 
} 

我接到一個同事的代碼審查,說:「這將導致細胞創建每次」但我一直做定製單元就這樣了,我不能在線查找任何不同的信息。試圖看看有什麼不對,想什麼?

+0

你註冊的筆尖文件?檢查每次創建單元格的最佳方法是在if語句中放置一個斷點 – 2014-11-03 00:00:56

+0

雖然我很久以前搬到故事板,所以可能不記得細節。我唯一會關心的就是'owner:nil';我期望'owner:self'。但除此之外,這似乎是它不會每次都會導致單元格創建,儘管它是舊式代碼。您最初將創建足夠的單元格來填充視圖(加上一對),之後它們將被回收。但請查看「registerNib:forCellReuseIdentifier:」或故事板,以便刪除「if(cell == nil){...}」代碼部分。 – 2014-11-03 00:44:52

+0

這看起來很好,這是舊式編碼。雖然正確的代碼審查意見應該是使用'dequeueReusableCellWithIdentifier:forIndexPath:';) – GoodSp33d 2014-11-03 04:35:42

回答

2

一種情況是,如果您的NIB文件指定了不同的單元重用標識符。然後,所有單元格都將具有該重用ID,並且因此永遠不會返回單元格。因此,您將永久加載NIB。但我看不到任何其他問題。

您可以註冊NIB文件以與該reuseIdentifier一起使用(使用registerNib:forCellReuseIdentifier:),那麼您將不需要if(cell == nil)的東西。

+0

謝謝,我在界面構建器中這樣做,但我改變了這種方式並擺脫了'(cell == nil)'區域,讓我們看到! – JeffN 2014-11-03 00:45:30

0

的文檔dequeueReusableCellWithIdentifier:forIndexPath:dequeueReusableCellWithIdentifier:指出:reuseIdentifier:方法

如果你註冊了一個類指定的標識符,並且必須創建一個新的細胞,這種方法通過調用其initWithStyle初始化的單元格。對於基於筆尖的單元格,此方法從提供的nib文件加載單元格對象。如果現有單元可供重用,則此方法將調用單元的prepareForReuse方法。

這是什麼意思是,如果你爲了註冊重用標識使用registerNib:forCellReuseIdentifier:registerClass:forCellReuseIdentifier:,你將永遠不會有機會來實例化一個自己。

來源:https://stackoverflow.com/a/22674466/1672895