为什么在制作自定义表格视图单元格时使可重复使用的单元格出队两次?

我正在按照使用故事板制作自定义表格视图单元格的教程。 我拖动UILabel作为单元格的子视图,并将它的标记设置为1.我有两个关于数据源代码的问题。

  1. 第二次出队声明的目的是什么? 我知道这是一个init方法,而不使用storyboard来定制单元格。

  2. tableview和self.tableview有什么区别?

    -(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier]; } NSDictionary *dToAccess = (self.tableView==tableView)?[self.arForTable objectAtIndex:indexPath.row] : [self.arForSearch objectAtIndex:indexPath.row]; [(UILabel*)[cell viewWithTag:1] setText:[dToAccess valueForKey:@"name"]]; [(UILabel*)[cell viewWithTag:2] setText:[dToAccess valueForKey:@"value"]]; return cell; } 

对于第一个问题,第二个dequeueReusableCellWithIdentifier:看起来像一个错误。

以下是UITableView的工作原理:

您的表格中可能有50行,但如果一次只能看到10行,则只需制作10个单元格,然后当用户滚动时,就可以重用已离开屏幕的单元格,而不是始终释放它们,并且init屏幕上出现新的细胞。 一个UITableView保存已经离开屏幕的单元的列表,当你调用dequeueReusableCellWithIdentifier时:它将它从屏幕外的单元列表中移除并返回给你。 从这里你可以自定义单元格重用(改变它的文本,颜色等)并返回它。 同样,这不是一个“init”方法,这是返回一个预先存在的单元格。

所以,让我们来看看当这个UITableView第一次显示时会发生什么 – 在这个例子中有10个可见的单元格,所以tableView将调用tableView:cellForRowAtIndexPath:10次来获取单元格显示在这10个槽中。 每次调用时,都需要初始化并返回一个新的UITableViewCell来显示。 (此时dequeueReusableCellWithIdentifier:将返回nil,因为您没有任何离线单元格可供重用)

当用户滚动列表时,单元格将开始离屏,并且需要出现新的单元格。 您不需要创build新的单元格,因为您已经创build了一次需要在屏幕上显示的单元格。 您应该调用dequeueReusableCellWithIdentifier:获取已经离开屏幕的单元格的引用,然后可以重新使用该单元格。

我会改变你的代码是这样的:

 static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: CellIdentifier] autorelease]; } 

现在您正在检查可重用单元格,然后再创build新单元格。

对于你的第二个问题,

在你的例子中,tableView引用传入的tableView(参见方法签名中的“tableView”)。 另外,如果你的类定义了一个名为tableView的属性,那么self.tableView将调用这个属性的getter。

当苹果为第一个iPhone开发UITableView时,它们在滚动时遇到了性能问题。 然后一位聪明的工程师发现,原因是物体的分配带来了一个代价,所以他想出了一种重用细胞的方法。

dequeueReusableCellWithIdentifier方法用于返回一个单元格,如果它已被标记为可以重用。

所以,当表格视图中的行数很多,并且要滚动它时,那么在滚动之前从刚才的屏幕移除的单元格将被重用,而不是创build新的单元格。

并知道你的第二个问题的答案。 我想你应该参考这个链接:

http://www.iphonedevsdk.com/forum/iphone-sdk-development/17669-when-use-self-objectname-just-objectname.html

两次出队是没有必要的,这段代码被破坏了。