尝试构建基于简单 UITabBarController 的 iOS 应用程序时出现运行时错误

Posted

技术标签:

【中文标题】尝试构建基于简单 UITabBarController 的 iOS 应用程序时出现运行时错误【英文标题】:Runtime error when attempting to construct simple UITabBarController based iOS application 【发布时间】:2011-04-26 03:58:19 【问题描述】:

我的代码可以编译,但是当我尝试启动它时遇到运行时错误。

这是运行时错误:

2011-04-25 23:56:40.689 Noun[39033:207] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<NounAppDelegate 0x4e1c400> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key viewController.'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x00dc75a9 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x00f1b313 objc_exception_throw + 44
    2   CoreFoundation                      0x00dc74e1 -[NSException raise] + 17
    3   Foundation                          0x0002f677 _NSSetUsingKeyValueSetter + 135
    4   Foundation                          0x0002f5e5 -[NSObject(NSKeyValueCoding) setValue:forKey:] + 285
    5   UIKit                               0x004b330c -[UIRuntimeOutletConnection connect] + 112
    6   CoreFoundation                      0x00d3d8cf -[NSArray makeObjectsPerformSelector:] + 239
    7   UIKit                               0x004b1d23 -[UINib instantiateWithOwner:options:] + 1041
    8   UIKit                               0x004b3ab7 -[NSBundle(UINSBundleAdditions) loadNibNamed:owner:options:] + 168
    9   UIKit                               0x002b917a -[UIApplication _loadMainNibFile] + 172
    10  UIKit                               0x002b9cf4 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 291
    11  UIKit                               0x002c4617 -[UIApplication handleEvent:withNewEvent:] + 1533
    12  UIKit                               0x002bcabf -[UIApplication sendEvent:] + 71
    13  UIKit                               0x002c1f2e _UIApplicationHandleEvent + 7576
    14  GraphicsServices                    0x0171f992 PurpleEventCallback + 1550
    15  CoreFoundation                      0x00da8944 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
    16  CoreFoundation                      0x00d08cf7 __CFRunLoopDoSource1 + 215
    17  CoreFoundation                      0x00d05f83 __CFRunLoopRun + 979
    18  CoreFoundation                      0x00d05840 CFRunLoopRunSpecific + 208
    19  CoreFoundation                      0x00d05761 CFRunLoopRunInMode + 97
    20  UIKit                               0x002b97d2 -[UIApplication _run] + 623
    21  UIKit                               0x002c5c93 UIApplicationMain + 1160
    22  Noun                                0x00001e68 main + 102
    23  Noun                                0x00001df9 start + 53
)
terminate called after throwing an instance of 'NSException'

这是我的代码(相关方法)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

    //Initiate TabBarController
    self.tabBarController = [[UITabBarController alloc] init];

    NSMutableArray *viewControllersForTabController = [[NSMutableArray alloc] initWithCapacity:2];

    NounViewController *firstViewController = [[NounViewController alloc] initWithNibName:@"NounViewController" bundle:[NSBundle mainBundle]];
    [viewControllersForTabController addObject:firstViewController];
    [firstViewController release];

    PostLoginViewController *secondViewController = [[PostLoginViewController alloc] initWithNibName:@"PostLoginViewController" bundle:[NSBundle mainBundle]];
    [viewControllersForTabController addObject:secondViewController];
    [secondViewController release];

    [tabBarController setViewControllers:viewControllersForTabController];
    [viewControllersForTabController release];

    [window addSubview:tabBarController.view];

    return YES;

我确定这可能是我忘记做的一些微不足道的事情,我正在慢慢跟上 ios 开发的速度

【问题讨论】:

【参考方案1】:

"NSUnknownKeyException" 当您访问不存在的键时会出现此异常,这并不总是因为代码,Interface Builder 中可能存在一些错误连接。上面的代码没有问题,我试了一下,运行成功。尝试检查您的 Interface builder 连接可能是您遗漏了一些东西。很可能首先您尝试通过 IB 添加 tabBarController,然后您正在通过代码进行操作。

【讨论】:

感谢 saadnib,我正在查看我的 plist 文件和我的 nib。这不是很明显。【参考方案2】:

我之前也遇到过同样的问题。问题是在 xib 文件中有一个接口构建器连接,在应用程序委托中没有相应的 IBOutlet 条目。 这就是我能够修复它的方法: 在 MainWindow.xib 文件中查找 XML 标记“IBObjectContainer”。您很可能会找到这样的条目:

<object class="IBConnectionRecord">
    <object class="IBCocoaTouchOutletConnection" key="connection">
        <string key="label">viewController</string>
        <reference key="source" ref="664661524"/>
        <reference key="destination" ref="943309135"/>
    </object>
    <int key="connectionID">11</int>
</object>

您可以安全地删除此条目,因为它似乎被错误地引入了 xib 文件。然后应用程序委托停止期待 IBOutlet 条目。 或者,您可以通过名称“viewController”在应用程序委托中添加一个 IBOutlet 条目。

确保在进行任何更改之前备份 xib​​ 文件。

可能有一种更简单的方法可以从 IB 中摆脱这种情况,但我通常不使用 IB,这对我有用。

【讨论】:

以上是关于尝试构建基于简单 UITabBarController 的 iOS 应用程序时出现运行时错误的主要内容,如果未能解决你的问题,请参考以下文章

构建基于Javascript的移动web CMS入门——简单介绍

基于 EventBridge 构建 SaaS 应用集成方案

基于PyTorch,如何构建一个简单的神经网络

简单构建基于RDF和SPARQL的KBQA(知识图谱问答系统)

json 简单的基于npm脚本的js项目构建

一个基于nodejs+koa2构建的简单轻量级MVC框架