Swift NSUnknownKeyException
Swift NSUnknownKeyException
一两天前开始学习 Swift。我 运行 进入这个错误的次数比我想要的要多——本质上,我意识到它与 IBOutlets 有关。删除情节提要中的所有出口和 buttons/objects,然后手动重新添加它们似乎可以解决问题。
如果将来发生此错误,并且我正在处理一个大型项目,我想知道如何诊断它是哪个 IBOutlet,或者是什么导致了这个错误。
我在GitHubhere上有一份项目的副本,如果有人想看一下并留下一些建议。
提前致谢!
2015-06-04 22:24:31.607 Controlling The Keyboard[1343:16382] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<Controlling_The_Keyboard.ViewController 0x7f80896418b0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key enterButton.'
*** First throw call stack:
(
0 CoreFoundation 0x0000000104855c65 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x00000001063c0bb7 objc_exception_throw + 45
2 CoreFoundation 0x00000001048558a9 -[NSException raise] + 9
3 Foundation 0x0000000104c73b53 -[NSObject(NSKeyValueCoding) setValue:forKey:] + 259
4 CoreFoundation 0x000000010479dd50 -[NSArray makeObjectsPerformSelector:] + 224
5 UIKit 0x00000001053cc52b -[UINib instantiateWithOwner:options:] + 1506
6 UIKit 0x0000000105224718 -[UIViewController _loadViewFromNibNamed:bundle:] + 242
7 UIKit 0x0000000105224d08 -[UIViewController loadView] + 109
8 UIKit 0x0000000105224f79 -[UIViewController loadViewIfRequired] + 75
9 UIKit 0x000000010522540e -[UIViewController view] + 27
10 UIKit 0x00000001051402c9 -[UIWindow addRootViewControllerViewIfPossible] + 58
11 UIKit 0x000000010514068f -[UIWindow _setHidden:forced:] + 247
12 UIKit 0x000000010514ce21 -[UIWindow makeKeyAndVisible] + 42
13 UIKit 0x00000001050f0457 -[UIApplication _callInitializationDelegatesForMainScene:transitionContext:] + 2732
14 UIKit 0x00000001050f31de -[UIApplication _runWithMainScene:transitionContext:completion:] + 1349
15 UIKit 0x00000001050f20d5 -[UIApplication workspaceDidEndTransaction:] + 179
16 FrontBoardServices 0x0000000107ed05e5 __31-[FBSSerialQueue performAsync:]_block_invoke_2 + 21
17 CoreFoundation 0x000000010478941c __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12
18 CoreFoundation 0x000000010477f165 __CFRunLoopDoBlocks + 341
19 CoreFoundation 0x000000010477ef25 __CFRunLoopRun + 2389
20 CoreFoundation 0x000000010477e366 CFRunLoopRunSpecific + 470
21 UIKit 0x00000001050f1b42 -[UIApplication _run] + 413
22 UIKit 0x00000001050f4900 UIApplicationMain + 1282
23 Controlling The Keyboard 0x0000000104654f37 main + 135
24 libdyld.dylib 0x0000000106b18145 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)
我以前遇到过这样的问题。我认为最好的方法是阅读错误日志并弄清楚发生了什么。
您的错误消息是
this class is not key value coding-compliant for the key enterButton
所以我可以知道它与某个名为 enterButton
的 IBOutlet 相关。然后你就可以知道enterButton是什么,你对它做了什么。
我了解到,如果您通过按住控制键拖动创建 IBOutlet,然后更改名称,有时您会破坏 xib 文件或情节提要中的映射。
如果你在 xib 文件中搜索 enterButton
,你可以看到 xml 文件已经定义了一些键来正确初始化正确的 UIView 元素。如果您更改了名称,则映射已损坏,因此出现问题。
这是经验,当你对iOS越来越熟悉时,你就会知道如何调试它。但我认为,您现在可以做的是了解如何从 nib 初始化视图和控制器,以及如何使用 LLDB 调试您的代码。这总是有帮助的。
与您的问题非常相似。看看吧。
在 ViewController
中添加以下行将解决您的问题。
@IBOutlet weak var enterButton: UIButton!
发生错误是因为 ViewController
与故事板文件中的三个 IBOutlet
相关联。
您在 ViewController.swift
文件中只写了两个 IBOutlet 作为 IBOutlet
。您错过了 enterButton
IBOutlet
。就是这样。
*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key enterButton.'
这就是为您提供答案的线索“setValue:forUndefinedKey:]:此 class 与键 enterButton 的键值编码不兼容”
从以上两点可以知道:
对象导致问题:Controlling_The_Keyboard.ViewController 0x7f80896418b0>
哪个 IBOutlet 导致问题:此 class 不符合键 enterButton 的键值编码。'
我花了一段时间才找到这个:我在顶级视图控制器的故事板身份检查器中的自定义 Class 名称错误。它与代码中视图控制器 class 的名称不匹配。虽然一切似乎都正常,并且可以建立插座和连接,看起来很干净,没有错误,但该应用程序会立即死于著名的 NSUnknownKeyException。解决此问题后,一切正常。 (Xcode 9, Swift 4).
一两天前开始学习 Swift。我 运行 进入这个错误的次数比我想要的要多——本质上,我意识到它与 IBOutlets 有关。删除情节提要中的所有出口和 buttons/objects,然后手动重新添加它们似乎可以解决问题。
如果将来发生此错误,并且我正在处理一个大型项目,我想知道如何诊断它是哪个 IBOutlet,或者是什么导致了这个错误。
我在GitHubhere上有一份项目的副本,如果有人想看一下并留下一些建议。
提前致谢!
2015-06-04 22:24:31.607 Controlling The Keyboard[1343:16382] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<Controlling_The_Keyboard.ViewController 0x7f80896418b0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key enterButton.'
*** First throw call stack:
(
0 CoreFoundation 0x0000000104855c65 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x00000001063c0bb7 objc_exception_throw + 45
2 CoreFoundation 0x00000001048558a9 -[NSException raise] + 9
3 Foundation 0x0000000104c73b53 -[NSObject(NSKeyValueCoding) setValue:forKey:] + 259
4 CoreFoundation 0x000000010479dd50 -[NSArray makeObjectsPerformSelector:] + 224
5 UIKit 0x00000001053cc52b -[UINib instantiateWithOwner:options:] + 1506
6 UIKit 0x0000000105224718 -[UIViewController _loadViewFromNibNamed:bundle:] + 242
7 UIKit 0x0000000105224d08 -[UIViewController loadView] + 109
8 UIKit 0x0000000105224f79 -[UIViewController loadViewIfRequired] + 75
9 UIKit 0x000000010522540e -[UIViewController view] + 27
10 UIKit 0x00000001051402c9 -[UIWindow addRootViewControllerViewIfPossible] + 58
11 UIKit 0x000000010514068f -[UIWindow _setHidden:forced:] + 247
12 UIKit 0x000000010514ce21 -[UIWindow makeKeyAndVisible] + 42
13 UIKit 0x00000001050f0457 -[UIApplication _callInitializationDelegatesForMainScene:transitionContext:] + 2732
14 UIKit 0x00000001050f31de -[UIApplication _runWithMainScene:transitionContext:completion:] + 1349
15 UIKit 0x00000001050f20d5 -[UIApplication workspaceDidEndTransaction:] + 179
16 FrontBoardServices 0x0000000107ed05e5 __31-[FBSSerialQueue performAsync:]_block_invoke_2 + 21
17 CoreFoundation 0x000000010478941c __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12
18 CoreFoundation 0x000000010477f165 __CFRunLoopDoBlocks + 341
19 CoreFoundation 0x000000010477ef25 __CFRunLoopRun + 2389
20 CoreFoundation 0x000000010477e366 CFRunLoopRunSpecific + 470
21 UIKit 0x00000001050f1b42 -[UIApplication _run] + 413
22 UIKit 0x00000001050f4900 UIApplicationMain + 1282
23 Controlling The Keyboard 0x0000000104654f37 main + 135
24 libdyld.dylib 0x0000000106b18145 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)
我以前遇到过这样的问题。我认为最好的方法是阅读错误日志并弄清楚发生了什么。
您的错误消息是
this class is not key value coding-compliant for the key enterButton
所以我可以知道它与某个名为 enterButton
的 IBOutlet 相关。然后你就可以知道enterButton是什么,你对它做了什么。
我了解到,如果您通过按住控制键拖动创建 IBOutlet,然后更改名称,有时您会破坏 xib 文件或情节提要中的映射。
如果你在 xib 文件中搜索 enterButton
,你可以看到 xml 文件已经定义了一些键来正确初始化正确的 UIView 元素。如果您更改了名称,则映射已损坏,因此出现问题。
这是经验,当你对iOS越来越熟悉时,你就会知道如何调试它。但我认为,您现在可以做的是了解如何从 nib 初始化视图和控制器,以及如何使用 LLDB 调试您的代码。这总是有帮助的。
在 ViewController
中添加以下行将解决您的问题。
@IBOutlet weak var enterButton: UIButton!
发生错误是因为 ViewController
与故事板文件中的三个 IBOutlet
相关联。
您在 ViewController.swift
文件中只写了两个 IBOutlet 作为 IBOutlet
。您错过了 enterButton
IBOutlet
。就是这样。
*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key enterButton.'
这就是为您提供答案的线索“setValue:forUndefinedKey:]:此 class 与键 enterButton 的键值编码不兼容”
从以上两点可以知道:
对象导致问题:Controlling_The_Keyboard.ViewController 0x7f80896418b0>
哪个 IBOutlet 导致问题:此 class 不符合键 enterButton 的键值编码。'
我花了一段时间才找到这个:我在顶级视图控制器的故事板身份检查器中的自定义 Class 名称错误。它与代码中视图控制器 class 的名称不匹配。虽然一切似乎都正常,并且可以建立插座和连接,看起来很干净,没有错误,但该应用程序会立即死于著名的 NSUnknownKeyException。解决此问题后,一切正常。 (Xcode 9, Swift 4).