0

我正在关注使用情节提要制作自定义表格视图单元的教程。我将 UILabel 拖动为单元格的子视图并将其标记设置为 1。关于数据源代码,我有两个问题。

  1. 第二个出队语句的目的是什么?我知道这是一个 init 方法,而不是使用情节提要来制作自定义单元格。

  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;
    }
    
4

3 回答 3

4

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

这是 UITableView 的工作原理:

您的表格中可能有 50 行,但如果一次只有 10 行可见,您只需要制作 10 个单元格,然后当用户滚动时,您可以重用已离开屏幕的单元格,而不是总是释放它们并初始化'ing 出现在屏幕上的新单元格。UITableView 会保存已离开屏幕的单元格列表,当您调用 dequeueReusableCellWithIdentifier: 时,它会将其从屏幕外单元格列表中删除并将其返回给您。从这里您可以自定义单元格以供重复使用(更改其文本、颜色等)并将其返回。同样,这不是“init”方法,这是返回一个预先存在的单元格。

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

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

我会像这样更改您的代码:

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier];

if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault
                                   reuseIdentifier: CellIdentifier] autorelease];
}

现在,您在创建新单元之前检查可重复使用的单元。

对于你的第二个问题,

在您的示例中,tableView 是指传入的 tableView(请参阅方法签名中的“tableView”)。另外,如果您的类定义了一个名为 tableView 的属性,那么 self.tableView 将调用该属性的 getter。

于 2012-08-04T22:22:39.113 回答
1

当苹果为第一部 iPhone 开发 UITableView 时,他们在滚动浏览它时遇到了性能问题。然后一位聪明的工程师发现,造成这种情况的原因是对象的分配是有代价的,所以他想出了一种重用单元的方法。

dequeueReusableCellWithIdentifier 方法用于返回一个已被标记为准备重用的单元格。

因此,每当表格视图中有很多行并且您要滚动它时,在滚动之前刚刚从上一个屏幕传递的单元格将被重用,而不是创建新的单元格。

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

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

于 2012-08-04T07:46:33.567 回答
0

不需要两次出队,这段代码被破坏了。

于 2012-08-13T20:02:59.440 回答