我已经阅读了关于这个主题的所有相关的其他问题,并尝试了修复,但没有一个有效。当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];
,那么应用程序不会崩溃。我的出局是什么导致了这个问题?!
答案 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"]; }