当键盘为 numberPad、phonePad 或 decimalPad 时应用程序崩溃(iOS 12.2,Xcode 10.2)
App crashes when keyboard is numberPad, phonePad or decimalPad (iOS 12.2, Xcode 10.2)
当键盘类型为 numberPad 或 phonePad 时,我的应用程序突然开始崩溃。崩溃发生在模拟器和设备中。我正在通过以下代码设置键盘类型。
self.textFieldMobileNumber.keyboardType = .numberPad
默认键盘工作正常。崩溃日志是 blow
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSSetM addObject:]: object cannot be nil'
*** First throw call stack:
(
0 CoreFoundation 0x0000000112d0f6fb __exceptionPreprocess + 331
1 libobjc.A.dylib 0x0000000112051ac5 objc_exception_throw + 48
2 CoreFoundation 0x0000000112c5dddc _CFThrowFormattedException + 194
3 CoreFoundation 0x0000000112c81601 -[__NSSetM addObject:] + 817
4 UIKitCore 0x000000011ca49f8f +[UIKeyboardImpl uniqueNumberPadInputModesFromInputModes:forKeyboardType:] + 1257
5 UIKitCore 0x000000011ca4998f -[UIKeyboardImpl desirableInputModesWithExtensions:] + 1446
6 UIKitCore 0x000000011ca4a0cf -[UIKeyboardImpl recomputeActiveInputModesWithExtensions:] + 54
7 UIKitCore 0x000000011ca3b158 -[UIKeyboardImpl setDelegate:force:] + 3343
8 UIKitCore 0x000000011ca8db1e -[UIPeripheralHost(UIKitInternal) _reloadInputViewsForResponder:] + 1506
9 UIKitCore 0x000000011cc4d417 -[UIResponder(UIResponderInputViewAdditions) reloadInputViews] + 81
10 UIKitCore 0x000000011cc4916a -[UIResponder becomeFirstResponder] + 865
11 UIKitCore 0x000000011d0d4fb8 -[UIView(Hierarchy) becomeFirstResponder] + 145
12 UIKitCore 0x000000011cf269ec -[UITextField becomeFirstResponder] + 237
13 UIKitCore 0x000000011cee67a5 -[UITextInteractionAssistant(UITextInteractionAssistant_Internal) setFirstResponderIfNecessary] + 208
14 UIKitCore 0x000000011ced3853 -[UITextSelectionInteraction oneFingerTap:] + 3851
15 UIKitCore 0x000000011c80714d -[UIGestureRecognizerTarget _sendActionWithGestureRecognizer:] + 57
16 UIKitCore 0x000000011c80fc69 _UIGestureRecognizerSendTargetActions + 109
17 UIKitCore 0x000000011c80d5ba _UIGestureRecognizerSendActions + 311
18 UIKitCore 0x000000011c80c897 -[UIGestureRecognizer _updateGestureWithEvent:buttonEvent:] + 966
19 UIKitCore 0x000000011c7fec4e _UIGestureEnvironmentUpdate + 2820
20 UIKitCore 0x000000011c7fe108 -[UIGestureEnvironment _deliverEvent:toGestureRecognizers:usingBlock:] + 478
21 UIKitCore 0x000000011c7fde96 -[UIGestureEnvironment _updateForEvent:window:] + 200
22 UIKitCore 0x000000011cc595bc -[UIWindow sendEvent:] + 4057
23 UIKitCore 0x000000011cc37d16 -[UIApplication sendEvent:] + 356
24 UIKitCore 0x000000011cd08293 __dispatchPreprocessedEventFromEventQueue + 3232
25 UIKitCore 0x000000011cd0abb9 __handleEventQueueInternal + 5911
26 CoreFoundation 0x0000000112c76be1 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
27 CoreFoundation 0x0000000112c76463 __CFRunLoopDoSources0 + 243
28 CoreFoundation 0x0000000112c70b1f __CFRunLoopRun + 1231
29 CoreFoundation 0x0000000112c70302 CFRunLoopRunSpecific + 626
30 GraphicsServices 0x00000001171ab2fe GSEventRunModal + 65
31 UIKitCore 0x000000011cc1dba2 UIApplicationMain + 140
32 IMRide 0x000000010b39beb8 main + 72
33 libdyld.dylib 0x000000011560a541 start + 1
34 ??? 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
我在整个互联网上搜索并尝试了很多我这边的解决方案,但问题没有解决。
编辑
当我设置默认键盘时。它显示 (null) 数字键盘,切换到它不会崩溃,但是当设置 .numberPad 键盘时它开始崩溃。
参考下图
终于找到问题了。我覆盖了 NumberFormatter
的方法,该方法在显示 numberPad 键盘时导致崩溃。
下面是我覆盖的方法,不应该这样做,或者以其他方式完成。
extension NumberFormatter {
open override func string(for obj: Any?) -> String? {
if condition {
return <some value based on condition>
}
return nil
}
}
返回 nil 导致崩溃。此外,如果你 return 其他东西而不是 obj
它将在键盘键中打印相同的内容。
当键盘类型为 numberPad 或 phonePad 时,我的应用程序突然开始崩溃。崩溃发生在模拟器和设备中。我正在通过以下代码设置键盘类型。
self.textFieldMobileNumber.keyboardType = .numberPad
默认键盘工作正常。崩溃日志是 blow
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSSetM addObject:]: object cannot be nil'
*** First throw call stack:
(
0 CoreFoundation 0x0000000112d0f6fb __exceptionPreprocess + 331
1 libobjc.A.dylib 0x0000000112051ac5 objc_exception_throw + 48
2 CoreFoundation 0x0000000112c5dddc _CFThrowFormattedException + 194
3 CoreFoundation 0x0000000112c81601 -[__NSSetM addObject:] + 817
4 UIKitCore 0x000000011ca49f8f +[UIKeyboardImpl uniqueNumberPadInputModesFromInputModes:forKeyboardType:] + 1257
5 UIKitCore 0x000000011ca4998f -[UIKeyboardImpl desirableInputModesWithExtensions:] + 1446
6 UIKitCore 0x000000011ca4a0cf -[UIKeyboardImpl recomputeActiveInputModesWithExtensions:] + 54
7 UIKitCore 0x000000011ca3b158 -[UIKeyboardImpl setDelegate:force:] + 3343
8 UIKitCore 0x000000011ca8db1e -[UIPeripheralHost(UIKitInternal) _reloadInputViewsForResponder:] + 1506
9 UIKitCore 0x000000011cc4d417 -[UIResponder(UIResponderInputViewAdditions) reloadInputViews] + 81
10 UIKitCore 0x000000011cc4916a -[UIResponder becomeFirstResponder] + 865
11 UIKitCore 0x000000011d0d4fb8 -[UIView(Hierarchy) becomeFirstResponder] + 145
12 UIKitCore 0x000000011cf269ec -[UITextField becomeFirstResponder] + 237
13 UIKitCore 0x000000011cee67a5 -[UITextInteractionAssistant(UITextInteractionAssistant_Internal) setFirstResponderIfNecessary] + 208
14 UIKitCore 0x000000011ced3853 -[UITextSelectionInteraction oneFingerTap:] + 3851
15 UIKitCore 0x000000011c80714d -[UIGestureRecognizerTarget _sendActionWithGestureRecognizer:] + 57
16 UIKitCore 0x000000011c80fc69 _UIGestureRecognizerSendTargetActions + 109
17 UIKitCore 0x000000011c80d5ba _UIGestureRecognizerSendActions + 311
18 UIKitCore 0x000000011c80c897 -[UIGestureRecognizer _updateGestureWithEvent:buttonEvent:] + 966
19 UIKitCore 0x000000011c7fec4e _UIGestureEnvironmentUpdate + 2820
20 UIKitCore 0x000000011c7fe108 -[UIGestureEnvironment _deliverEvent:toGestureRecognizers:usingBlock:] + 478
21 UIKitCore 0x000000011c7fde96 -[UIGestureEnvironment _updateForEvent:window:] + 200
22 UIKitCore 0x000000011cc595bc -[UIWindow sendEvent:] + 4057
23 UIKitCore 0x000000011cc37d16 -[UIApplication sendEvent:] + 356
24 UIKitCore 0x000000011cd08293 __dispatchPreprocessedEventFromEventQueue + 3232
25 UIKitCore 0x000000011cd0abb9 __handleEventQueueInternal + 5911
26 CoreFoundation 0x0000000112c76be1 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
27 CoreFoundation 0x0000000112c76463 __CFRunLoopDoSources0 + 243
28 CoreFoundation 0x0000000112c70b1f __CFRunLoopRun + 1231
29 CoreFoundation 0x0000000112c70302 CFRunLoopRunSpecific + 626
30 GraphicsServices 0x00000001171ab2fe GSEventRunModal + 65
31 UIKitCore 0x000000011cc1dba2 UIApplicationMain + 140
32 IMRide 0x000000010b39beb8 main + 72
33 libdyld.dylib 0x000000011560a541 start + 1
34 ??? 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
我在整个互联网上搜索并尝试了很多我这边的解决方案,但问题没有解决。
编辑
当我设置默认键盘时。它显示 (null) 数字键盘,切换到它不会崩溃,但是当设置 .numberPad 键盘时它开始崩溃。
参考下图
终于找到问题了。我覆盖了 NumberFormatter
的方法,该方法在显示 numberPad 键盘时导致崩溃。
下面是我覆盖的方法,不应该这样做,或者以其他方式完成。
extension NumberFormatter {
open override func string(for obj: Any?) -> String? {
if condition {
return <some value based on condition>
}
return nil
}
}
返回 nil 导致崩溃。此外,如果你 return 其他东西而不是 obj
它将在键盘键中打印相同的内容。