在ios应用程序中,我有一个UITableView。在cellForRowAtIndexPath
方法中,我需要使用它的NIB名称返回自定义单元格。为此,我使用loadNibNamed
。 (我将在'willDisplayCellforRowAtIndexPath'加载后填充单元格中的数据)
MyItemCell是一个XIB文件(MyItemCell.xib),它包含2个UIImageView和一个UIButton(每个项目都有一个标签)
这是我的代码:
在我的viewController中
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
return [ViewHelper loadCustomCellWithNibName:@"MyItemCell" owner:self];
}
从NIB加载Custom单元格的方法
+ (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;
}
所有测试中的一切都正常。但是我收到了一些我无法重现的用户崩溃。
这是崩溃:
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
问题是我无法重现这次崩溃。
有什么可能导致崩溃的想法?或者任何避免这种错误的解决方案?
非常感谢您的帮助
修改
只是为了澄清更多,这对我正在进行的任何测试都非常有效。对于1个用户,这次崩溃只出现了一次,所以问题不在于代码。我只是在非常具体的情况下搜索可能导致崩溃的原因。感谢
答案 0 :(得分:12)
要从NIB文件创建自定义单元格,请尝试以下
- (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文件的名称,也用作单元标识符。
答案 1 :(得分:1)
请试试这个...它不会有任何问题...
- (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文件创建tableViewCell是不可能的。所以创建一个简单的View控制器,然后将UIViewController更改为UITableViewCell ......