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

Ios 为什么dequeueReusableCellWithIdentifier会导致我的整个应用程序崩溃/挂起?,ios,objective-c,uitableview,Ios,Objective C,Uitableview,我已经阅读了关于这个主题的所有其他相关问题,并尝试了修复,但没有一个有效。当调用dequeueReusableCellWithIdentifier:时,我的应用程序崩溃/挂起到必须强制退出Xcode才能重新开始工作的程度 如果我使用dequeueReusableCellWithIdentifier:,或dequeueReusableCellWithIdentifier:forIndexPath:,并且我已使用registerClass:forCellReuseIdentifier:设置了类,这没

我已经阅读了关于这个主题的所有其他相关问题,并尝试了修复,但没有一个有效。当调用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"];
}
并尝试在我的数据源中的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];
}
如果我删除所有其他代码,但取消注释
返回[UITableViewCell new]则应用程序不会崩溃。是什么原因导致了我的排队问题

试试这个:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nil];
if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"flavourCellIdentifier"]; }
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"NIB_NAME" owner:self options:nil];

尝试删除类注册: [self.tableView注册表类:[UITableViewCell类]强制重用标识符:@“flavourCell”]


如果要从情节提要实例化通用UITableViewCell类单元,则不需要注册该类

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

我把你的手机弄成了静态的。但是为了消除registerClass函数上的重复,您可以创建一个
#define REUSE_IDENTIFIER@“flavourCell”

如果这仍然很慢,则
[self.flavourWheel selectedflavor]原因。查看仪器教程以了解性能改进:


请注意,如果您的单元格是XIB中的一个对象,并且您正在使用以下内容:

[self.tableView registerNib:[UINib nibWithNibName:@"cell_class_name" bundle:nil] forCellReuseIdentifier:@"cell_reuse_name"];
要注册单元格,请确保Interface Builder中属性检查器中的标识符正确,在本例中为@“cell\u reuse\u name”

如果标识符不同,您可能会遇到一种奇怪的情况,即每次都从nib创建新单元,即

NSArray *objects = [bundle loadNibNamed:@"cell_nib_name"
                                  owner:nil
                                options:nil];
cell = (UITableViewCell *)[objects safeObjectAtIndex:0];
似乎工作正常,但尝试使用

[tableView dequeueReusableCellWithIdentifier:@"cell_reuse_name"];
撞车


实际上,对XIB、自定义类和重用标识符使用相同的名称通常是最简单的。然后,如果有问题,您可以确保它们都是相同的。

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

试试这个:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nil];
if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"flavourCellIdentifier"]; }
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"NIB_NAME" owner:self options:nil];

如果它挂起,说明您的XIB有问题(如我的情况)。

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

为标识符(单元格)注册的nib无效-nib必须仅包含一个顶级对象,该对象必须是UICollectionReusableView实例


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

您能发布崩溃日志吗?CellForRowatineXpath方法中返回的tableView是否与self.tableView相同?我知道如果你使用的是搜索栏,它发送给这个方法的tableview实际上是一个不同的实例,它不会注册单元格。我不能发布崩溃日志,因为整个过程会无限期地挂起,而不会真正停止,我必须杀死Xcode以停止它的运行,因为即使杀死模拟器也不起作用。我怎么知道传入了哪个tableView?我的应用程序中只有一个tableView,我会认为是这个?我会认为是ios 6。如何确定?在我添加注册之前它崩溃了,如果我删除它,它仍然会崩溃。我不是在使用故事板,而是以编程的方式来做每件事?事实上,你认为FlavourWheel方法是非常正确的。这就是问题所在。。。我是一个不会读调试器的白痴。非常感谢。