【问题标题】:Changing name of ViewController causes app to crash?更改 ViewController 的名称会导致应用程序崩溃?
【发布时间】:2011-09-24 17:18:52
【问题描述】:

我使用 iOS SDK 4.3 在 XCode (4.0) 中创建了一个新的基于 View 的 iPhone 应用程序。然后我将 ViewController 的名称从 MyProjectNameViewController 更改为 LoginViewController。我还用LoginViewController 替换了我能找到的MyProjectNameViewController 的每个实例,并仔细检查了界面生成器中的所有链接。

然而,当我尝试运行应用程序时,它崩溃了:

2011-06-29 10:21:36.927 Monitoring[12580:207] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<LoginViewController 0x4b26bf0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key password.'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x00dc05a9 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x00f14313 objc_exception_throw + 44
    2   CoreFoundation                      0x00dc04e1 -[NSException raise] + 17
    3   Foundation                          0x00792677 _NSSetUsingKeyValueSetter + 135
    4   Foundation                          0x007925e5 -[NSObject(NSKeyValueCoding) setValue:forKey:] + 285
    5   UIKit                               0x0020e30c -[UIRuntimeOutletConnection connect] + 112
    6   CoreFoundation                      0x00d368cf -[NSArray makeObjectsPerformSelector:] + 239
    7   UIKit                               0x0020cd23 -[UINib instantiateWithOwner:options:] + 1041
    8   UIKit                               0x0020eab7 -[NSBundle(UINSBundleAdditions) loadNibNamed:owner:options:] + 168
    9   UIKit                               0x000c4628 -[UIViewController _loadViewFromNibNamed:bundle:] + 70
    10  UIKit                               0x000c2134 -[UIViewController loadView] + 120
    11  UIKit                               0x000c200e -[UIViewController view] + 56
    12  UIKit                               0x00035d42 -[UIWindow addRootViewControllerViewIfPossible] + 51
    13  MyProjectName                       0x000022c7 -[MyProjectNameAppDelegate application:didFinishLaunchingWithOptions:] + 135
    14  UIKit                               0x00012c89 -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1163
    15  UIKit                               0x00014d88 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 439
    16  UIKit                               0x0001f617 -[UIApplication handleEvent:withNewEvent:] + 1533
    17  UIKit                               0x00017abf -[UIApplication sendEvent:] + 71
    18  UIKit                               0x0001cf2e _UIApplicationHandleEvent + 7576
    19  GraphicsServices                    0x00ff9992 PurpleEventCallback + 1550
    20  CoreFoundation                      0x00da1944 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
    21  CoreFoundation                      0x00d01cf7 __CFRunLoopDoSource1 + 215
    22  CoreFoundation                      0x00cfef83 __CFRunLoopRun + 979
    23  CoreFoundation                      0x00cfe840 CFRunLoopRunSpecific + 208
    24  CoreFoundation                      0x00cfe761 CFRunLoopRunInMode + 97
    25  UIKit                               0x000147d2 -[UIApplication _run] + 623
    26  UIKit                               0x00020c93 UIApplicationMain + 1160
    27  MyProjectName                       0x00002209 main + 121
    28  MyProjectName                       0x00002185 start + 53

我需要做什么来解决这个问题?

【问题讨论】:

  • 我还替换了我能找到的每一个实例...我想你错过了一个。
  • 说真的,我一遍又一遍地检查了每个类,并查看了 xibs 的源代码,没有一个旧控制器名称的实例。
  • 您是手动完成的还是使用重构工具完成的?
  • 我猜知道重构工具的存在会为我节省很多时间。但不,我是手工完成的。
  • 在发生这种情况时,清理所有目标是您的朋友,如果没有意义,清理所有目标,构建并运行,然后在需要时与墙搏斗。

标签: iphone xcode cocoa-touch ios4 uiviewcontroller


【解决方案1】:

您是否也重命名了 nib/xib 中的类?

错误消息告诉您有东西想通过 KVC 访问 password,而调用它的对象 (LoginViewController) 不提供对 password 的 KVC 兼容访问。你有没有摆弄password getters/setters?

【讨论】:

  • 是的,我确实重命名了 xibs 中的类,并且我查看了 xibs 中的源代码,一切正常。我实际上没有任何名为 password 的东西,而且我的任何代码中都没有引用它。
  • 某事正在寻找密码...可能绑定在笔尖中?
【解决方案2】:

我建议您执行 Build/Clean All Targets,删除项目中的 /Build/ 目录,然后重新运行该项目。如果它仍然崩溃,那么你一定错过了什么。

【讨论】:

  • 好吧,这很奇怪,但我一辈子都找不到 /Build/ 目录。它通常与项目在同一目录中,对吧?
  • 找到了。它在 Users/me/Library/Developer/Xcode/DerivedData/MyProjectName-bkzvxpbmqezjiuekoyjrwutshmkm/Build/Products/Debug-iphonesimulator/MyProjectName.app 中是否正常?
  • 是的——这很正常。找到它的更简单方法是使用 Xcode 的 Organizer,它会向您显示所有项目派生产品的位置 - 您可以从那里删除它们。
【解决方案3】:

您的插座格式不正确。笔尖正在寻找将“密码”绑定到的东西,但您的控制器中没有相应的属性。

【讨论】:

  • 我没有任何名为password 的出口,也没有在我的代码中任何地方引用它。
【解决方案4】:

原来我需要从 iPhone 模拟器中删除应用程序并重新加载它。它不应该自动执行此操作吗???

【讨论】:

  • 应该,但没有。你应该向 Apple 提出一个错误。
【解决方案5】:

只需通过以下方式获取: 1) 选择要更改的名称:MyProjectNameViewController 2) Edit -> Refactor, 填写“LoginViewController” 而已。但请注意,如果您之前将 storyboardID 设置为与视图控制器相同,是否可能需要手动更改它。

【讨论】:

    猜你喜欢
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 2017-01-19
    • 1970-01-01
    相关资源
    最近更新 更多