自定义单元格失败了

时间:2010-04-08 22:09:52

标签: iphone objective-c

我正在尝试使用自定义UITableViewCell,并且我将它放在与UITableView控制器相同的nib文件中。为此,文件是:NTItems.h,NTItems.m和NTItems.xib。

我在头文件中定义了单元格:

IBOutlet UITableViewCell *cellview;

我正确地应用了这个属性:nonatomic,保留所以它就在那里:

@property (nonatomic, retain) IBOutlet UITableViewCell *cellview;

在m文件中 - 我合成了变量设备,并使用它来获取自定义单元格:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

   static NSString *CellIdentifier = @"cellview";

   UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

   if (cell == nil) {
    cell = self.cellview;
   }

   Product *aProduct = [appDelegate.products objectAtIndex:indexPath.row];

   name.text  = aProduct.name;
   upc.text   = [NSString stringWithFormat:@"UPC%@",aProduct.upc];
   price.text = aProduct.pid;
   return cell;
 }

然而,当我加载桌子时,我得到了这个可怕的混乱:

alt text http://dl.dropbox.com/u/1545603/tablecellissue.png

还应该有超过1个单元格显示数据。似乎现在只显示最后一个数据。

2 个答案:

答案 0 :(得分:1)

您无法重复使用此类插座中的单个单元格。想一想:每次拨打tableView:cellForRowAtIndexPath:时,你都会返回同一个小区。如果可能的话,请求tableView将单元格出列,并且每次都不创建新单元格,这是你的工作。

相反,将自定义单元格存储在单独的笔尖中,并在出列失败时在if (cell == nil) { }代码中读取该笔尖。

包含自定义单元格的nib文件应该具有其文件所有者NSObject,并且它应该只包含单元格的nib(没有其他对象)。

我使用此函数加载nib:

- (id)loadObjectFromNibNamed: (NSString *)inName;
{
    id objectsInNib = [[NSBundle mainBundle] loadNibNamed: inName
                                                     owner: self
                                                   options: nil];
     NSAssert1( objectsInNib != nil, @"loadNibNamed %@ returned nil", inName );
     NSAssert2( [objectsInNib count] == 1, @"lodNibNamed %@ returned %d items", inName, [objectsInNib count] );
     return [objectsInNib objectAtIndex: 0];
    }

然后在tableView:cellForRowAtIndexPath:我有:

if ( cell == nil ) {
    cell = [self loadObjectFromNibNamed: nibName];
}

(我使用与我的单元格重用标识符相同的笔尖名称。)

答案 1 :(得分:1)

发生的事情是你只在整个桌子上使用一个单元格。这意味着绘制的最后一个单元格是唯一可见的单元格。先前的细胞基本上不存在。

您需要查看此document,了解如何从NIB创建自定义表格视图单元格。

那里有分步说​​明。