我正在开发一个简单的应用程序,它具有以下前提:
我使用标准单元格(如字幕等)非常好用。我使用的是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;
}
但它仍然是正常的高度。
对此的任何帮助都将受到大力赞赏!
谢谢,
答案 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)
registerNib
。如果您创建了UITableViewCell子类,请单独使用registerClass
。