我查看了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中,我将我的类更改为用于UITableViewCell的TargetDetailTableViewCell,我只是将其拖入IB。我将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的Owner属性集。我不知道他们是如何连接那个插座的,因为它在他们使用单元格的类中声明为属性,但它们没有实际的IB连接。有人可以向我解释这个或我做错了什么吗?
此外,如果有人能够解释这一点,那就太棒了:
UINib *nib = [UINib nibWithNibName:@"TargetDetailTableViewCell" bundle:nil];
[nib instantiateWithOwner:self options:nil];
cell = self.TargetCell;
self.TargetCell = nil;
似乎你创建了nib,并且从内存中实例化的nib的所有者是你所在的类或者是我自己的类(我的viewcontroller)。然后最后两行混淆了我。就像你告诉你的单元格指向新创建的对象,然后将新创建的对象设置为nil。我认为,在我的脑海中,细胞现在也指向零。感谢。
答案 0 :(得分:2)
您需要在自定义表格视图单元格中拥有所有者,并且该所有者需要是您的TableViewDataSource类(即实现cellForRowAtIndexPath方法且具有到表格单元格的TargetCell插座的表视图控制器)。
您还需要将文件所有者(TableViewController)中的此TargetCell插座连接到自定义表视图。
这样做的原因是当您加载nib时,将您的表视图控制器作为所有者,然后它会将您拥有的插座(TargetCell属性)设置为指向您的nib中定义的表视图单元格。
然后将此引用复制到单元格方法变量,配置它并返回它。在复制之后将属性赋值为nil,因为您只需要它作为引导程序来获取对nib中对象的引用,以便在cellForRowAtIndexPath方法中使用。