2012-02-02 41 views
0

为一个UITableViewCell出口我看着TableViewUpdates /苹果的WWDC 2010码TVAnimationGestures时遇到麻烦复制一个UITableViewCell子类。这是我做了什么:分配使用UINib

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

@interface TargetDetailTableViewCell : UITableViewCell 

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

在.M,我只是释放内存。在IB中,我将我的类更改为TargetDetailTableViewCell,以获取我刚刚拖入IB的UITableViewCell。我将TargetDetailTableViewCell的插座连接到适当的标签和图像视图。

在我想使用这个类:

@class TargetDetailTableViewCell; 

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

在.M:

- (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:'

唯一想我可以看到Apple的例子和我的例子不同,当我在他们的IB中单击UITableViewCell的子类时,他们有一个File's Owner属性集。我不知道他们如何连接这个插座,因为它被声明为他们使用该单元的类中的一个属性,但是他们没有实际的IB连接。有人可以向我解释,或者我做错了什么?

此外,如果任何人都可以解释这一点,那将是巨大的:

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

好像你创建的笔尖和被从内存中实例化的笔尖的所有者是你在类或自(我的viewcontroller)。然后最后两行让我困惑。就像你告诉你的单元指向新创建的对象,然后将新创建的对象设置为零。我认为,在我的脑海中,细胞现在指向零。谢谢。

回答

2

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

您还需要从文件所有者(TableViewController)这个TargetCell插座连接到您的自定义表视图。

原因是当你加载nib时,以你的表视图控制器为所有者,它将设置你拥有的出口(TargetCell属性)指向你的笔尖中定义的表视图单元格。

然后,您可以复制这对单元格引用的方法变量,配置它并返回它。您将该属性复制后指定为nil,因为您只需要将其作为引导程序来获取对nib中的对象的引用,以便在cellForRowAtIndexPath方法中使用。

+0

快速跟进问题。所以'cell = self.TargetCell'拷贝了对象,不只是指向那个会使下一行为零的引用?如果我想重复使用这个自定义的UITableViewCell,我是否将另一个文件的所有者对象添加到我的笔尖,并做同样的事情?再次感谢。 – Crystal 2012-02-02 03:04:10

+0

self.TargetCell是对UITableViewCell对象实例的引用。将此引用复制到本地“单元”变量中,因此由于此第二次引用,对象将保留到方法结束。然后,您在方法结尾处返回单元格,并且表视图现在具有对它的引用,因此它由表视图保留。当你设置self.TargetCell = nil时,你只是清除对该对象的特定引用(即你没有执行[self.TargetCell release]),它也会释放基础对象。这只是你正在清理的参考。 – gamozzii 2012-02-02 03:15:51

+0

要在不同的表视图控制器中重复使用相同的自定义表格单元格和笔尖,您可能需要定义一个通用的“MyCellOwner”对象,该对象具有此表格单元格类型的出口,并将其设置为表格单元格笔尖中的所有者,而不是表格视图控制器。然后在cellForRowAtIndex代码alloc/init中创建一个'MyCellOwner',并用它来加载nib(即作为调用中的owner字段),它将在MyCellOwner对象的实例中创建对表格单元格的引用。然后从该参考中复制。 (可能有一种更简单的方法,我可能会使它过于复杂。) – gamozzii 2012-02-02 03:22:39