UITableView自定义单元格抛出SIGABRT错误

时间:2012-02-20 16:23:09

标签: iphone objective-c xcode ios5 uitableview

我正在尝试为我的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:'

我错过了哪一部分?

7 个答案:

答案 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

然后我确保以下事项正确:

  • 表格视图单元格具有正确的自定义类(ResultsCustomCell)。
  • UITableViewCell的单元标识符在Interface Builder中是正确的。
  • 界面构建器中的UILabel已正确链接到IBOutlet。
  • UITableView视图具有正确的控制器(ViewController)

使用此代码并检查以上所有内容后,它似乎正常工作。

答案 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")