iPad应用程序仅在设备上而不是在模拟器中加载笔尖时崩溃

Posted

技术标签:

【中文标题】iPad应用程序仅在设备上而不是在模拟器中加载笔尖时崩溃【英文标题】:iPad app crashes on loading nib only on device not in simulator 【发布时间】:2011-08-03 19:07:31 【问题描述】:

我知道以前有人问过这个问题,我花了很多时间在各种线程中遵循建议,不仅在这个网站上,而且无济于事。

我正在为 iPad 开发一个包含多个视图的应用程序。这些视图中的每一个都包含一个 UITableView。一些 TableView 单元格包含使用 UITableViewCell 实现的自定义单元格。现在的问题是我可以在 iPad 模拟器上毫无问题地运行我的应用程序,但不能在实际设备上运行。在设备上 - 一旦我尝试访问包含有问题的定制 UITableViewCell 的视图,它就会崩溃并显示以下消息:

2011-08-03 20:37:13.849 myApp[658:707] Creating cell: LabledTextFieldCell.xib
2011-08-03 20:37:13.866 myApp[658:707] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </var/mobile/Applications/B9A24738-FA19-4A54-8CE5-813B48E6871E/iCockpit-Client.app> (loaded)' with name 'LabledTextFieldCell.xib''

我反复检查,一切似乎都井井有条。该文件存在于 Xcode 中以及文件系统中,并且在代码中以正确的名称引用。

这是发生崩溃的代码行:

[[NSBundle mainBundle] loadNibNamed:MyIdentifier owner:self options:nil];

在更大的背景下:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

int curRow = indexPath.row;
int i = 0;

if (indexPath.section > 0) 

    while (i < indexPath.section) 

        curRow = curRow + [self sectionSize:i];
        i++;
    

   

UITableViewCell *cellRet;

if (indexPath.section == 1) 
     // code
 else if (indexPath.section == 2) 
    // ...
 else if (indexPath.section == 3) 
    static NSString *MyIdentifier = @"LabledSwitchCell";

    NSLog(@"Creating cell: %@", MyIdentifier);

    cellRet = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    if (cellRet == nil) 

        // CRASHES
        // -------
        [[NSBundle mainBundle] loadNibNamed:MyIdentifier owner:self options:nil];
        // -------

        cellRet = self.cell;
        self.cell = nil;
    

    // more code...

可能值得注意的是:nib 最初是通过 File -> New -> New File...、Cocoa Touch -> UIViewController 子类添加的,它提供了三个文件 - MyClassViewController.m、MyClassViewController.h 和 MyClassViewController.xib .我已将 MyClassViewController.xib(在我的实际情况中为 LabledTextfieldViewController.xib)重命名为 MyClassView.xib (LabledTextfieldView.xib),这对我来说似乎更合乎逻辑。

如上所述,该应用在模拟器中运行良好,问题仅出现在实际设备上。

我的 Xcode 版本是最新的 Xcode 4.1 (Build 4B110)。

提前致谢。非常感谢任何帮助!

【问题讨论】:

【参考方案1】:

检查您的 NIB 文件名的拼写,尤其是大写和小写。

我相信模拟器文件系统不区分大小写,但实际设备是。

【讨论】:

天哪,你是对的!我没有太大希望,但是由于您的回答,我再次检查了大小写的差异,实际上,笔尖文件的名称是LabledTextfieldCell,我将其引用为LabledTextFieldCell。该文件的初始实现来自我的同事,我从未注意到他的不同命名约定。非常感谢,这可能为我节省了更多的调试时间。 :-)

以上是关于iPad应用程序仅在设备上而不是在模拟器中加载笔尖时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

preg_replace 仅在文本上而不是在 href 中

我的应用在 iPad 模拟器上运行良好,但在 iPad(iOS 8.4)上崩溃,xcode 说无法在捆绑中加载 NIB

从我自己的包中加载笔尖?

AngularJS Node 应用程序下载而不是在 Internet Explorer 中加载

如果用户在远程设备上而不是在工作计算机上,如何限制网站访问? (工作时间跟踪应用程序)

仅在物理设备而非模拟器上运行 Android 应用程序