UITableView从NIB文件加载一个自定义单元格抛出NSInternalInconsistencyException

在一个iOS应用程序中,我有一个UITableView。 在cellForRowAtIndexPath方法中,我需要使用它的NIB名称返回一个自定义单元格。 为此我使用loadNibNamed 。 (我将在“willDisplayCellforRowAtIndexPath”中加载后填充单元格中的数据)

MyItemCell是包含2个UIImageView和一个UIButton的XIB文件(MyItemCell.xib)(每个项目都有一个标签)

这是我的代码:

在我的viewController

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { return [ViewHelper loadCustomCellWithNibName:@"MyItemCell" owner:self]; } 

并从NIB加载自定义单元格的方法

 + (UITableViewCell *) loadCustomCellFromNib:(NSString *)nibName owner:(id)owner { UITableViewCell *cell = nil; NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:nibName owner:owner options:nil]; if([nibObjects count] > 0 ) { cell = [nibObjects objectAtIndex:0]; } else { NSLog(@"Failed to load %@ XIB file!", nibName); } return cell; } 

在所有的testing中一切正常。 不过,我收到了一些我无法复制的用户的崩溃。

这是崩溃:

 NSInternalInconsistencyException Could not load NIB in bundle: 'NSBundle </var/mobile/Applications/7A24cE79-131F-523F-4C00-23B523ARG123/MyApp.app> (loaded)' with name 'MyItemCell' 

堆栈跟踪:

 0 CoreFoundation 0x39b432a3 __exceptionPreprocess + 163 + 162 1 libobjc.A.dylib 0x33a3297f objc_exception_throw + 31 + 30 2 CoreFoundation 0x39b431c5 -[NSException initWithCoder:] + 1 3 UIKit 0x32e12491 -[UINib instantiateWithOwner:options:] + 1637 + 1636 4 UIKit 0x32e1a1d7 -[NSBundle(UINSBundleAdditions) loadNibNamed:owner:options:] + 139 + 138 5 MyApp 0x00047ded +[ViewHelper loadCustomCellFromNib:owner:] (ViewHelper.m:349) 6 MyApp 0x00034003 -[BuildViewController tableView:cellForRowAtIndexPath:] (BuildViewController.m:2432) 7 UIKit 0x32cc0545 -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:] + 413 + 412 8 UIKit 0x32ca530b -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow:] + 1311 + 1310 9 UIKit 0x32cbc7c7 -[UITableView layoutSubviews] + 207 + 206 10 UIKit 0x32c78803 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 259 + 258 

问题是我无法重现这个崩溃。

任何想法可能导致了这次事故? 或者任何解决scheme,以避免这样的错误?

非常感谢您的帮助

编辑:

只是为了澄清更多,这对我正在做的任何testing都是完美的。 这个崩溃对于一个用户来说只出现一次,所以问题不在代码中。 我只是在一个非常具体的情况下寻找可能导致这次崩溃的原因。 谢谢

从NIB文件创build自定义单元格请试试这个

 - (void)viewDidLoad { [tableView registerNib:[UINib nibWithNibName:CellIdentifier bundle:nil] forCellReuseIdentifier:CellIdentifier]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { MyCell *cell = (MyCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; ...... return cell; } 

CellIdentifier是NIB文件的名称,也用作单元标识符。

请尝试这个…它不会给任何问题…

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"albumListCell"; albumListCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = (albumListCell *) [[[NSBundle mainBundle] loadNibNamed:@"albumListCell" owner:self options:nil] lastObject]; } return cell; } 

用nib文件创buildtableViewCell是不可能的。所以创build一个简单的视图控制器,然后将UIViewController更改为UITableViewCell …