为什么dequeueReusableCellWithIdentifier导致我的整个应用程序崩溃/挂起?

时间:2013-12-13 14:07:44

标签: ios objective-c uitableview

我已经阅读了关于这个主题的所有相关的其他问题,并尝试了修复,但没有一个有效。当dequeueReusableCellWithIdentifier:被调用时,我的应用程序崩溃/挂起以至于我必须强制退出Xcode才能重新开始工作。

如果我使用dequeueReusableCellWithIdentifier:或dequeueReusableCellWithIdentifier:forIndexPath:,并且我已经使用registerClass:forCellReuseIdentifier:设置了类,那么没有区别,如下面的代码所示。

在我的ViewController中注册类:

@implementation LWSFlavourMatchesViewController

-(void)viewDidLoad
{
    [super viewDidLoad];
    _flavourMatchesView = [LWSFlavourMatchesView     flavourMatchesViewWithDataSource:self.flavourMatchesDataSource andDelegate:self.flavourMatchesDelegate];
    self.tableView = _flavourMatchesView;
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"flavourCell"];
}

尝试在我的dataSource中的tableView:cellForRowAtIndexPath中出列单元格:

@implementation LWSFlavourMatchesDataSource

// other methods...

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *flavourCellIdentifier = @"flavourCell";
    NSString *currentSelectedFlavour = [self.flavourWheel selectedFlavour];
    UITableViewCell *tableViewCell = [tableView dequeueReusableCellWithIdentifier:flavourCellIdentifier forIndexPath:indexPath];
    if(tableViewCell == nil)
    {
        tableViewCell = [[UITableViewCell alloc ]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:flavourCellIdentifier];
    }
   [tableViewCell.textLabel setText: currentSelectedFlavour];
    return tableViewCell;
//    return [UITableViewCell new];
}

如果我删除所有其他代码但取消注释return [UITableViewCell new];,那么应用程序不会崩溃。我的出局是什么导致了这个问题?!

6 个答案:

答案 0 :(得分:2)

我重构了你的tableview委托。您不需要检查单元格是否为零,因为您使用[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"flavourCell"];注册了该类。

我将你的cellIdentifier设为静态。但要删除registerClass函数上的重复项,可以创建#define REUSE_IDENTIFIER @"flavourCell"

如果这仍然很慢,那么[self.flavourWheel selectedFlavour];就是原因。查看仪器教程以获得性能改进:http://www.raywenderlich.com/23037/how-to-use-instruments-in-xcode

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *flavourCellIdentifier = @"flavourCell";
    NSString *currentSelectedFlavour = [self.flavourWheel selectedFlavour];
    UITableViewCell *tableViewCell = [tableView dequeueReusableCellWithIdentifier:flavourCellIdentifier forIndexPath:indexPath];
    [tableViewCell.textLabel setText: currentSelectedFlavour];
    return tableViewCell;
}

答案 1 :(得分:1)

尝试删除课程注册:     [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@“flavourCell”];

如果要从故事板中实例化通用UITableViewCell类单元,则不需要注册该类

答案 2 :(得分:1)

此错误的另一个原因可能是 -

为标识符(Cell)注册的无效nib - nib必须只包含一个必须是UICollectionReusableView实例的顶级对象

我的xib中有一个UIView而不是collectionViewCell。当然,如果.xib中有多个顶级对象,则会显示相同的崩溃。希望这会有所帮助。

答案 3 :(得分:0)

请注意,如果您的单元格是XIB中的对象,并且您使用的是:

[self.tableView registerNib:[UINib nibWithNibName:@"cell_class_name" bundle:nil] forCellReuseIdentifier:@"cell_reuse_name"];

要注册单元格,请确保Interface Builder中属性检查器中的标识符正确,在本例中为@“cell_reuse_name”。

如果标识符不相同,您可能会遇到奇怪的情况,即每次从笔尖创建新单元格,即

NSArray *objects = [bundle loadNibNamed:@"cell_nib_name"
                                  owner:nil
                                options:nil];
cell = (UITableViewCell *)[objects safeObjectAtIndex:0];

似乎工作正常,但尝试使用

[tableView dequeueReusableCellWithIdentifier:@"cell_reuse_name"];

崩溃。

实际上,对于XIB,自定义类和重用标识符使用相同的名称通常是最容易的。如果有问题,你可以确保它们都是一样的。

答案 4 :(得分:0)

我有完全不同的问题。基于String / XIB的本地化不匹配。它确实有助于启用/禁用+删除不需要的本地化。

试试这个:

NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"NIB_NAME" owner:self options:nil];

如果它挂起,你的XIB就会出现问题(就像我的情况一样)。

答案 5 :(得分:-2)

试试这个:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nil];
if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"flavourCellIdentifier"]; }