0

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

  • 带有加号按钮的 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;
}

但它仍然是正常的高度。

对此的任何帮助将不胜感激!

谢谢,

4

2 回答 2

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:调用都是不必要的。)

我会使用第二种方法,但这只是个人喜好问题。

于 2013-11-12T08:15:17.270 回答
1

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

self.tableView registerClass:forCellReuseIdentifier:

或者

self.tableView registerNib:forCellReuseIdentifier:

在你的viewDidLoad(假设 self.tableView 指向你的 UITableView)

顺便说一句,不要同时执行!如果您为您的单元格制作了 xib,请registerNib单独使用。如果您创建了 UITableViewCell 子类,请registerClass单独使用。

于 2013-11-12T08:28:49.777 回答