简体   繁体   中英

App crashes when keyboard is numberPad, phonePad or decimalPad (iOS 12.2, Xcode 10.2)

My app has suddenly started crashing when keyboard type is numberPad or phonePad. The crash happen in simulator and device both. I am setting keyboard type by below code.

self.textFieldMobileNumber.keyboardType = .numberPad

Default keyboard just works fine. The crash log is 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

I have searched all over the internet and tried many solution from my side but the issue did not fix.

Edit

When I set default keyboard. It shows (null) for number keyboard, switching to that does not crash but when set .numberPad keyboard it starts crashing.

Check the image below for the reference

在此处输入图片说明

Finally I found the issue. I had overridden a method of NumberFormatter which caused the crash while showing numberPad keyboard.

Below is the method that I override which should not have been done, or done in some other way.

extension NumberFormatter {
    open override func string(for obj: Any?) -> String? {
         if condition {
             return <some value based on condition>
         }
         return nil
    }
}

Returning nil caused the crash. Also if you return something else rather then the obj it will print the same in keyboard keys.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM