我查看了Apple的WWDC2010代码中的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;在.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:'
我唯一能看到的苹果的例子和我的例子不同的是,当我在他们的IB中点击UITableViewCell的子类时,他们有一个文件的Owner属性集。我不知道他们是如何连接这个插座的,因为它被声明为他们使用该单元的类中的一个属性,但他们没有建立物理IB连接。有没有人能给我解释一下,或者我做错了什么?
另外,如果有人能解释这一点,那就太好了:
UINib *nib = [UINib nibWithNibName:@"TargetDetailTableViewCell" bundle:nil];
[nib instantiateWithOwner:self options:nil];
cell = self.TargetCell;
self.TargetCell = nil;似乎您创建了nib,从内存实例化的nib的所有者是您所在的类或self (我的视图控制器)。然后最后两行把我搞糊涂了。这就像您告诉您的单元格指向新创建的对象,然后将新创建的对象设置为nil。在我的脑海中,我想,细胞现在也指向零。谢谢。
发布于 2012-02-02 10:08:16
您需要在您的自定义表格视图单元格nib中拥有一个所有者,并且该所有者需要是您的TableViewDataSource类(即实现cellForRowAtIndexPath方法并具有到表格单元格的TargetCell插座的表格视图控制器)。
您还需要将此TargetCell插座从文件所有者( TableViewController)连接到您的自定义表视图。
这样做的原因是,当您使用表格视图控制器作为所有者加载笔尖时,它会将您拥有的插座( TargetCell属性)设置为指向在笔尖中定义的表格视图单元格。
然后将此引用复制到cell方法变量,对其进行配置并返回。在复制该属性后将其赋值为nil,因为您只需要将其作为引导程序来获取对半边对象的引用,以便在cellForRowAtIndexPath方法中使用。
https://stackoverflow.com/questions/9105674
复制相似问题