使用NSFetchedResultsController实现自定义表格视图单元格(带有标签和自定义大小)

时间:2013-11-12 07:48:28

标签: core-data uitableview nsfetchedresultscontroller custom-cell

我正在开发一个简单的应用程序,它具有以下前提:

  • 带有加号按钮的TableViewController - 用户按下并以模态显示文本字段以输入以表示名称,标题等。当他们按保存时,视图控制器消失并将这些条目添加到核心数据数据库和条目显示在表视图中。

我使用标准单元格(如字幕等)非常好用。我使用的是NSFetchedResultsController,我想现在部署自定义单元格。

我将样式更改为Storyboard中的自定义单元格,并添加了三个标签,代表名称,标题和金额(由用户添加)。

我为UITableViewCell创建了一个自定义类,并确保此表视图单元格是该自定义引用类。我添加了标签的属性:nameLabel,amountLabel,titleLabel。

我将这个类导入了完整的TableViewController类。按照在线教程,它基本上只是使用cellForRowAtIndexPath方法,如下所示:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  static NSString *cellIdentifier = @"TableCellID";

  TableCell *tablecell = (TableCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];


  NSDictionary * dict = [self.tweetsArray objectAtIndex:indexPath.row];

  tablecell.title.text = [dict objectForKey:@"tweet"];

  UIImage *imageIcon = [UIImage imageNamed:[dict objectForKey:@"image"]];
  [tablecell.cellImage setImage:imageIcon];

  return tablecell;

}

这不是我的代码,而是引自:http://www.codigator.com/tutorials/ios-uitableview-tutorial-custom-cell-and-delegates/,但概念是相同的。

因为我使用的是NSFetchedResultsController,所以我实际上有两种方法用于单元格:

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
    Transaction *transaction = [self.fetchedResultsController objectAtIndexPath:indexPath];
    cell.nameLabel.text =[NSString stringWithFormat:@"%@", transaction.name];
    cell.amountLabel.text = [NSString stringWithFormat:@"%@", transaction.amount];
    cell.eventLabel.text = [NSString stringWithFormat:@"%@", transaction.title];
}

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

    static NSString *CellIdentifier = @"People";

    TransactionCell *cell = (TransactionCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // Set up the cell...
    [self configureCell:cell atIndexPath:indexPath];

    return cell;
}

此代码不起作用,因为nameLabel,amountLabel实际上未被识别。

我(就像顶部的代码一样)将所有信息都放入cellForRowAtIndexPath,但后来我从

中得到了一个错误
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath { 

方法因为它有以下条目:

case NSFetchedResultsChangeUpdate:
            [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
            break;

我尝试更改

的方法签名
- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {

是:

- (void)configureCell:(TransactionCell *)cell atIndexPath:(NSIndexPath *)indexPath {

但这对我来说似乎不对,并且有警告。

所以基本上我并没有想要实现任何复杂的事情。我只是想创建一个带有三个标签的自定义单元格 - 为什么在configureCell方法中无法识别来自cellForRowAtIndexPath的“单元格”?

最后,自定义单元格具有特定大小,大于正常大小,并且在应用程序运行时不会出现;它仍然正常。我在单元格的检查器中执行了此操作,但还将以下代码添加到表视图类的末尾:

- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView
{
    tableView.rowHeight = 80;
}

但它仍然是正常的高度。

对此的任何帮助都将受到大力赞赏!

谢谢,

2 个答案:

答案 0 :(得分:1)

您有两种选择:

  • configureCell的签名更改为

    - (void)configureCell:(TransactionCell *)cell atIndexPath:(NSIndexPath *)indexPath
    

    并在

    中添加额外的演员表
    case NSFetchedResultsChangeUpdate:
        [self configureCell:(TransactionCell *)[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
        break;
    
  • 或者保留configureCell的签名,并将其转换为方法:

    - (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
        TransactionCell *tcell = (TransactionCell *)cell;
        Transaction *transaction = [self.fetchedResultsController objectAtIndexPath:indexPath];
        tcell.nameLabel.text = transaction.name;
        tcell.amountLabel.text = transaction.amount;
        tcell.eventLabel.text = transaction.title;
    }
    

    (请注意,所有stringWithFormat:次电话都是不必要的。)

我会使用第二种方法,但这只是一种品味问题。

答案 1 :(得分:1)

这是因为你可能忘了打电话了

self.tableView registerClass:forCellReuseIdentifier:

或者

self.tableView registerNib:forCellReuseIdentifier:

viewDidLoad中(假设self.tableView指向您的UITableView)

顺便说两句都不实现!如果您为细胞制作了xib,请单独使用registerNib。如果您创建了UITableViewCell子类,请单独使用registerClass