2014-11-02 155 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