0

我查看了 Apple 的 WWDC 2010 代码中的 TableViewUpdates/TVAnimationGestures 并且在复制 UITableViewCell 子类时遇到了麻烦。这就是我所做的:

我用一些简单的属性创建了一个新的 UITableViewCell 子类:

@interface TargetDetailTableViewCell : UITableViewCell

@property (nonatomic, retain) IBOutlet UILabel *DescriptionLabel;
@property (nonatomic, retain) IBOutlet UILabel *ValueLabel;
@property (nonatomic, retain) IBOutlet UIImageView *DotImageView;

在.m中,我只是释放内存。在 IB 中,我将我刚刚拖入 IB 的 UITableViewCell 的类更改为 TargetDetailTableViewCell。我将 TargetDetailTableViewCell 的出口连接到适当的标签和图像视图。

在课堂上我想使用这个:

@class TargetDetailTableViewCell;

//some properties
@property (nonatomic, assign) IBOutlet TargetDetailTableViewCell *TargetCell;

在他们中:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {    
    static NSString *TargetCellIdentifier = @"TargetDetailTableViewCellIdentifier";
    TargetDetailTableViewCell *cell = (TargetDetailTableViewCell *)[tableView dequeueReusableCellWithIdentifier:TargetCellIdentifier];

    if (cell == nil) {
        UINib *nib = [UINib nibWithNibName:@"TargetDetailTableViewCell" bundle:nil];
        [nib instantiateWithOwner:self options:nil];
        cell = self.TargetCell;
        self.TargetCell = nil;
    }
// set some labels
return cell;
}

当我运行它时,我收到错误:Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'

我唯一能看到苹果的例子和我的例子不同的是,当我在他们的 IB 中点击 UITableViewCell 的子类时,他们有一个 File's Owner 属性集。我不知道他们是如何连接那个插座的,因为它在他们使用单元的类中被声明为一个属性,但是他们没有建立物理 IB 连接。有人可以向我解释一下或者我做错了什么吗?

另外,如果有人可以解释这一点,那就太好了:

        UINib *nib = [UINib nibWithNibName:@"TargetDetailTableViewCell" bundle:nil];
        [nib instantiateWithOwner:self options:nil];
        cell = self.TargetCell;
        self.TargetCell = nil;

似乎您创建了笔尖,而从内存中实例化的笔尖的所有者是您所在的类或自己(我的视图控制器)。然后最后两行让我感到困惑。这就像你告诉你的单元格指向新创建的对象,然后你将新创建的对象设置为 nil。我认为在我的脑海中,单元格现在也指向零。谢谢。

4

1 回答 1

2

您需要在您的自定义表格视图单元格 nib 中有一个所有者,并且该所有者需要是您的 TableViewDataSource 类(即实现 cellForRowAtIndexPath 方法并具有到表格单元格的 TargetCell 出口的表格视图控制器)。

您还需要将来自文件所有者(TableViewController)的 TargetCell 出口连接到您的自定义表格视图。

这样做的原因是,当您加载 nib 时,以您的表格视图控制器为所有者,然后它将设置您拥有的插座(TargetCell 属性)指向您笔尖中定义的表格视图单元格。

然后将此引用复制到单元方法变量,对其进行配置并返回它。在复制它之后将属性分配给 nil,因为您只需要它作为引导程序来获取对 nib 中对象的引用,以便在 cellForRowAtIndexPath 方法中使用。

于 2012-02-02T02:08:16.193 回答