我正在尝试为我的UITableView创建一个自定义单元格。我正在使用Xcode 4.2并使用故事板和ARC。
我创建了一个类来表示自定义单元格,如下所示:
ResultsCustomCell.h
#import <UIKit/UIKit.h>
@interface ResultsCustomCell : UITableViewCell
{
IBOutlet UILabel *customLabel;
}
@property (nonatomic, retain) IBOutlet UILabel* customLabel;
@end
ResultsCustomCell.m
#import "ResultsCustomCell.h"
@implementation ResultsCustomCell
@synthesize customLabel;
@end
然后我在视图控制器中实现了UITableView方法,如下所示: 的 ViewController.m
#import "ViewController.h"
#import "ResultsCustomCell.h"
@implementation ViewController
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
}
// Set the number of items in the tableview to match the array count
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 5;
}
// Populate TableView cells with contents of array.
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"CellIdentifier";
ResultsCustomCell *myCell = [tableView dequeueReusableCellWithIdentifier:@"CellIdentifier"];
myCell.customLabel.text = @"helloWorld";
return myCell;
}
// Define height for cell.
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 80;
}
@end
应用程序构建成功但随后崩溃并给我以下错误:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'
我错过了哪一部分?
答案 0 :(得分:20)
这是一个令人恼火的问题,因为调试器不会让您知道发生了什么。它会中断异常,然后在您单击Continue Execution时关闭。
这让我疯了30分钟,直到我右键点击自定义单元格中的UILabel给我提出问题,这揭示了答案:你的单元格中的一个控件已经(或者,当你明显修复它时,可能没有注意到一个虚假的出路。 “虚假插座”是指连接到您的类中不再存在的IBOutlet属性的插件。在我的情况下,我更改了属性的名称并重新连接,但忘记删除旧的引用插座连接。
一旦我移除了有问题的插座,问题就消失了。
答案 1 :(得分:2)
您忘记在未出列的情况下创建新的UITableViewCell
// Populate TableView cells with contents of array.
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"CellIdentifier";
ResultsCustomCell *myCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (myCell == nil) {
myCell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
myCell.customLabel.text = @"helloWorld";
return myCell;
}
答案 2 :(得分:2)
您忘记在故事板中针对原型单元格添加重用标识符(&#34; CellIdentifier&#34;),因此当它尝试创建新单元格时,故事板中没有该标识符的原型,它返回nil
。
答案 3 :(得分:1)
@property (nonatomic, retain) IBOutlet UILabel* customLabel;
自动引用计数(ARC)禁止显式调用retain
。尝试删除它。
对于错误,您确实返回UITableViewCell
,而不是自定义单元格。此外,您永远不会分配ResultsCustomCell
。
- (ResultsCustomCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"CellIdentifier";
ResultsCustomCell *cell = (ResultsCustomCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[ResultsCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
// Configure the cell.
cell.textLabel.text = @"Text";
return cell;
}
此外,您的UITableViewCell
子类未声明(显然是强制性的)方法init
。
ResultsCustomCell.h:
#import <UIKit/UIKit.h>
@interface ResultsCustomCell : UITableViewCell
@property (strong, nonatomic) UILabel *myLabel;
@end
ResultsCustomCell.m:
#import "ResultsCustomCell.h"
@implementation ResultsCustomCell
@synthesize myLabel;
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// Initialization code
}
return self;
}
@end
编辑:我看到你正在使用故事板。我的建议可能对您有所帮助,也可能没有帮助。我从未使用过故事板。
答案 4 :(得分:1)
我不完全确定我已经采取了哪些措施来解决我的问题,但它现在正常运作。
以下是我目前在ViewController.m
中的内容注意:ResultsCustomCell.h和.m与上面相同。
#import "ViewController.h"
#import "ResultsCustomCell.h"
@implementation ViewController
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
}
// Set the number of items in the tableview to match the array count
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 5;
}
// Populate TableView cells with contents of array.
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"CellIdentifier";
// Make sure there are no quotations (") around the cell Identifier.
ResultsCustomCell *myCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
myCell.customLabel.text = @"helloWorld";
return myCell;
}
// Define height for cell.
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 80;
}
@end
然后我确保以下事项正确:
使用此代码并检查以上所有内容后,它似乎正常工作。
答案 5 :(得分:0)
我也用与你相同的设置来对抗这个错误。我意识到,对我来说,它是由iOS6的新“自动布局”功能引起的。要禁用它,我打开了自定义单元格xib,然后在右侧的Utilities中打开了文件检查器选项卡(最左边的选项卡)。在那里,我可以取消选中“使用Autolayout”。
答案 6 :(得分:0)
我通过错误地使用错误的类类型注册标识符创建了此异常。
enum
然后出队并转换为其他类类型:
//The Identifier is register with the wrong class type
self.listView.register(CustomCellClass1.self, forCellReuseIdentifier: "CustomCellClass2")