1

我有一个自定义UITableViewCell子类,并且我读到这应该是为 iOS 5 加载自定义单元格的正确方法:

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   CustomCell *cell = [tv dequeueReusableCellWithIdentifier:@"customCell"];

   if (cell == nil) {
      cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"customCell"];

      // Configure cell
      cell.nameLabel.text = self.customClass.name;
   }

   return cell;
}

但是当我运行应用程序时,标签文本没有显示。但是,我也尝试过这种方式:

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:@"customCell"];

   if (cell == nil) {
      NSArray* views = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:nil options:nil];

   for (UIView *view in views) {
        if([view isKindOfClass:[UITableViewCell class]])
        {
            cell = (CustomCell *)view;
        }
    }

    // Configure cell
    ((CustomCell *)cell).nameLabel.text = self.customClass.name;
}

return cell;

}

这样标签就显示出来了,但是在方法reuseIdentifier中设置了any。loadNibName:加载自定义单元格的最佳方式应该是什么?我需要支持 iOS 5+。第一种方法是否行不通,因为我要配置单元格的标签和样式initWithStyle:方法中而不是在表格视图的方法中配置单元格的标签和样式?

谢谢!

4

3 回答 3

3

您的代码中的错误cell.nameLabel.text是仅在这种if (cell == nil) { ... }情况下设置,而不是一般情况下设置。

加载自定义单元格的最简单方法是

  • registerNib:forCellReuseIdentifier:如果单元格在 nib 文件中定义,则使用,或
  • registerClass:forCellReuseIdentifier:如果单元格是以编程方式创建的,则使用,或者
  • 使用情节提要并将“CustomCell”定义为表格视图的“原型单元”。

例如(在viewDidLoad):

[self.tableView registerNib:[UINib nibWithNibName:@"CustomCell" bundle:nil] forCellReuseIdentifier:@"customCell"];

然后dequeueReusableCellWithIdentifier 将始终返回一个单元格,因此cellForRowAtIndexPath简化为

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   CustomCell *cell = [tv dequeueReusableCellWithIdentifier:@"customCell"];
   cell.nameLabel.text = self.customClass.name;
   return cell;
}
于 2013-08-14T08:57:18.673 回答
0

使用此代码(NewCustomCell 是您的自定义 UITableViewCell 类名)...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    NewCustomCell *cell = (NewCustomCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        NSArray *nib=[[NSBundle mainBundle]loadNibNamed:@"NewCustomCell" owner:self options:nil];
        cell=[nib objectAtIndex:0];
    }

    return cell;
}

快乐的编码... :)

于 2013-08-14T09:17:03.730 回答
0

只需使用此代码并尝试。

static NSString *cellIdentifier=@"cell";
    YourCustomCell *cell = (YourCustomCell *) [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if (cell == nil)
    {
        NSString *customeCellName = [NSString stringWithFormat:@"%@",[YourCustomCell class]];

        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:customeCellName owner:self options:nil];

        for (id currentObject in topLevelObjects)
        {
            if ([currentObject isKindOfClass:[UITableViewCell class]])
            {
                cell =  (YourCustomCell *) currentObject;
                break;
            }
        }
    }
    cell.nameLabel.text = self.customClass.name; // Make sure self.customclass.name have value.
    return cell;
于 2013-08-14T08:55:05.697 回答