NSUnknownKeyException 即使定义了出口
Posted
技术标签:
【中文标题】NSUnknownKeyException 即使定义了出口【英文标题】:NSUnknownKeyException even though outlets are defined 【发布时间】:2018-06-29 20:51:15 【问题描述】:我在框架中有一个带有相应 xib 的自定义视图。在界面生成器中,我将文件所有者和视图本身设置为UIView
(TotalTokenCountView
) 的子类。我还在自定义视图中为两个标签设置了插座。但是,当我在应用程序中使用此自定义视图时,我得到一个 NSUnknownKeyException
异常。
我尝试将 outlet vars 设置为 public 以确保它们可以在框架之外连接,但这也不起作用。
我在这里遗漏了什么吗?我需要做更多设置才能连接插座吗?
public class TotalTokenCountView: UIView
@IBOutlet public weak var tokenLabel: UILabel!
@IBOutlet public weak var tokenCountLabel: UILabel!
public override func awakeFromNib()
tokenCountLabel.textColor = UIColor.deepPurple
tokenLabel.textColor = UIColor.lavenderGrayMedium
static func create() -> TotalTokenCountView
return mybundle.loadNibNamed("TotalTokenCountView", owner: self, options: nil)!.first! as! TotalTokenCountView
创建自定义视图的代码:
public class TotalTokenCountBarButtonItem: UIBarButtonItem
public required init?(coder aDecoder: NSCoder)
super.init(coder: aDecoder)
commonInit()
private func commonInit()
self.customView = TotalTokenCountView.create()
IB 截图:
例外:
*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<MyFrameworkTarget.TotalTokenCountView 0x104ed9580> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key tokenCountLabel.'
*** First throw call stack:
(
0 CoreFoundation 0x000000010a0d31e6 __exceptionPreprocess + 294
1 libobjc.A.dylib 0x000000010550a031 objc_exception_throw + 48
2 CoreFoundation 0x000000010a0d30b9 -[NSException raise] + 9
3 Foundation 0x0000000104f2bb47 -[NSObject(NSKeyValueCoding) setValue:forKey:] + 292
4 UIKit 0x000000010622fe8a -[UIRuntimeOutletConnection connect] + 109
5 CoreFoundation 0x000000010a075e8d -[NSArray makeObjectsPerformSelector:] + 317
6 UIKit 0x000000010622e834 -[UINib instantiateWithOwner:options:] + 1856
7 MyFrameworkTarget 0x0000000104ed73bf _T012MyFrameworkTarget19TotalTokenCountViewC6createACyFZ + 431
8 MyFrameworkTarget 0x0000000104ed817b _T012MyFrameworkTarget28TotalTokenCountBarButtonItemC10commonInit33_82940FA39F221CEB8A8645FA6323AFBFLLyyF + 43
9 MyFrameworkTarget 0x0000000104ed80bc _T012MyFrameworkTarget28TotalTokenCountBarButtonItemCACSgSo7NSCoderC5coder_tcfc + 124
10 MyFrameworkTarget 0x0000000104ed813f _T012MyFrameworkTarget28TotalTokenCountBarButtonItemCACSgSo7NSCoderC5coder_tcfcTo + 47
11 UIKit 0x000000010622f725 -[UIClassSwapper initWithCoder:] + 246
12 UIKit 0x000000010648188c UINibDecoderDecodeObjectForValue + 704
13 UIKit 0x00000001064815bf -[UINibDecoder decodeObjectForKey:] + 246
14 UIKit 0x000000010671219b -[UINavigationItem initWithCoder:] + 715
15 UIKit 0x000000010648188c UINibDecoderDecodeObjectForValue + 704
16 UIKit 0x00000001064815bf -[UINibDecoder decodeObjectForKey:] + 246
17 UIKit 0x0000000105f44db1 -[UIViewController initWithCoder:] + 407
18 UIKit 0x0000000105fac885 -[UITabBarController initWithCoder:] + 65
19 UIKit 0x000000010648188c UINibDecoderDecodeObjectForValue + 704
20 UIKit 0x0000000106481a2a UINibDecoderDecodeObjectForValue + 1118
21 UIKit 0x00000001064815bf -[UINibDecoder decodeObjectForKey:] + 246
22 UIKit 0x0000000105f451a0 -[UIViewController initWithCoder:] + 1414
23 UIKit 0x0000000105f74dcc -[UINavigationController initWithCoder:] + 65
24 UIKit 0x000000010648188c UINibDecoderDecodeObjectForValue + 704
25 UIKit 0x00000001064815bf -[UINibDecoder decodeObjectForKey:] + 246
26 UIKit 0x000000010622f3f1 -[UIRuntimeConnection initWithCoder:] + 178
27 UIKit 0x000000010648188c UINibDecoderDecodeObjectForValue + 704
28 UIKit 0x0000000106481a2a UINibDecoderDecodeObjectForValue + 1118
29 UIKit 0x00000001064815bf -[UINibDecoder decodeObjectForKey:] + 246
30 UIKit 0x000000010622e5e2 -[UINib instantiateWithOwner:options:] + 1262
31 UIKit 0x00000001066bb406 -[UIStoryboard instantiateViewControllerWithIdentifier:] + 181
32 UIKit 0x0000000105da5862 -[UIApplication _loadMainStoryboardFileNamed:bundle:] + 112
33 UIKit 0x0000000105da5d33 -[UIApplication _loadMainInterfaceFile] + 272
34 UIKit 0x0000000105da44b9 -[UIApplication _runWithMainScene:transitionContext:completion:] + 1403
35 UIKit 0x0000000106166f7e __111-[__UICanvasLifecycleMonitor_Compatability _scheduleFirstCommitForScene:transition:firstActivation:completion:]_block_invoke + 866
36 UIKit 0x0000000106539a39 +[_UICanvas _enqueuePostSettingUpdateTransactionBlock:] + 153
37 UIKit 0x0000000106166bba -[__UICanvasLifecycleMonitor_Compatability _scheduleFirstCommitForScene:transition:firstActivation:completion:] + 236
38 UIKit 0x00000001061673db -[__UICanvasLifecycleMonitor_Compatability activateEventsOnly:withContext:completion:] + 675
39 UIKit 0x0000000106ad8614 __82-[_UIApplicationCanvas _transitionLifecycleStateWithTransitionContext:completion:]_block_invoke + 299
40 UIKit 0x0000000106ad84ae -[_UIApplicationCanvas _transitionLifecycleStateWithTransitionContext:completion:] + 433
41 UIKit 0x00000001067bc75d __125-[_UICanvasLifecycleSettingsDiffAction performActionsForCanvas:withUpdatedScene:settingsDiff:fromSettings:transitionContext:]_block_invoke + 221
42 UIKit 0x00000001069b74b7 _performActionsWithDelayForTransitionContext + 100
43 UIKit 0x00000001067bc627 -[_UICanvasLifecycleSettingsDiffAction performActionsForCanvas:withUpdatedScene:settingsDiff:fromSettings:transitionContext:] + 223
44 UIKit 0x00000001065390e0 -[_UICanvas scene:didUpdateWithDiff:transitionContext:completion:] + 392
45 UIKit 0x0000000105da2eac -[UIApplication workspace:didCreateScene:withTransitionContext:completion:] + 515
46 UIKit 0x0000000106375bcb -[UIApplicationSceneClientAgent scene:didInitializeWithEvent:completion:] + 361
47 FrontBoardServices 0x000000010d5752f3 -[FBSSceneImpl _didCreateWithTransitionContext:completion:] + 331
48 FrontBoardServices 0x000000010d57dcfa __56-[FBSWorkspace client:handleCreateScene:withCompletion:]_block_invoke_2 + 225
49 libdispatch.dylib 0x00000001089c97ec _dispatch_client_callout + 8
50 libdispatch.dylib 0x00000001089cedb8 _dispatch_block_invoke_direct + 592
51 FrontBoardServices 0x000000010d5a9470 __FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__ + 24
52 FrontBoardServices 0x000000010d5a912e -[FBSSerialQueue _performNext] + 439
53 FrontBoardServices 0x000000010d5a968e -[FBSSerialQueue _performNextFromRunLoopSource] + 45
54 CoreFoundation 0x000000010a075bb1 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
55 CoreFoundation 0x000000010a05a4af __CFRunLoopDoSources0 + 271
56 CoreFoundation 0x000000010a059a6f __CFRunLoopRun + 1263
57 CoreFoundation 0x000000010a05930b CFRunLoopRunSpecific + 635
58 GraphicsServices 0x000000010cdc9a73 GSEventRunModal + 62
59 UIKit 0x0000000105da6057 UIApplicationMain + 159
60 PinataApp 0x0000000104be62c7 main + 55
61 libdyld.dylib 0x0000000108a46955 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
【问题讨论】:
你是否包含了@objc 属性? 添加界面生成器的截图,以便我们查看您是否正确设置了网点和类 @Knight0fDragon - 我尝试了 objc 属性,但这似乎也不起作用 在每个按键/插座上? 我在属性和类上都设置了 【参考方案1】:从File's Owner
中删除引用(出口)并将它们添加到TotalTokenCountView
。
【讨论】:
【参考方案2】:不确定这是否会导致您的问题,但在您调用 loadNibNamed 时,您将 self 作为所有者传递。由于您使用的是静态方法,因此这是对类类型的引用,而不是实例。
【讨论】:
以上是关于NSUnknownKeyException 即使定义了出口的主要内容,如果未能解决你的问题,请参考以下文章
NSUnknownKeyException setValue:forUndefinedKey:[重复]
NSXMLParser 由于 NSUnknownKeyException 而终止
我的应用程序崩溃并产生“NSUnknownKeyException”
未捕获的异常 'NSUnknownKeyException' - 此类与键 buttonPressed 的键值编码不兼容