编辑:将问题加上“Method Swizzle Crash”以帮助其他人找到错误。
对于在模拟器或任何运行iOS 4或更高版本的设备上的越南键盘中按下的每个键,以下消息将打印到控制台,并且不会向第一个响应者发送任何字符:
Can't find transliterator file: vi_TelexTransliterator
utrans_transUChars error U_ILLEGAL_ARGUMENT_ERROR
我的服务器或客户端代码中没有这些字符串或子字符串的实例。这来自API。
运行iOS 4的模拟器和设备将在第二次按键时始终崩溃。 iOS 5上没有崩溃。调用堆栈顶部的错误如下所示:
*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSCFString substringToIndex:]: Range or index out of bounds'
调用堆栈如下所示:
Foundation -[NSString substringToIndex:]
TextInput -[TIKeyboardInputManagerZephyr internalIndexToExternal:]
TextInput -[TIKeyboardInputManagerZephyr inputCount]
UIKit -[UIKeyboardImpl addInputString:fromVariantKey:]
UIKit -[UIKeyboardImpl handleStringInput:fromVariantKey:]
UIKit -[UIKeyboardImpl handleKeyEvent:]
UIKit -[UIApplication _handleKeyEvent:]
UIKit -[UIResponder(Internal) _handleKeyEvent:]
UIKit -[UIResponder(Internal) _handleKeyEvent:]
UIKit -[UIResponder(Internal) _handleKeyEvent:]
UIKit -[UIResponder(Internal) _handleKeyEvent:]
UIKit -[UIResponder(Internal) _handleKeyEvent:]
UIKit -[UIResponder(Internal) _handleKeyEvent:]
UIKit -[UIResponder(Internal) _handleKeyEvent:]
UIKit -[UIResponder(Internal) _handleKeyEvent:]
UIKit -[UIResponder(Internal) _handleKeyEvent:]
UIKit -[UIResponder(Internal) _handleKeyEvent:]
UIKit -[UIApplication handleKeyEvent:]
UIKit -[UIKeyboardLayoutStar sendStringAction:forKey:]
UIKit -[UIKeyboardLayoutStar touchUp:]
UIKit -[UIKeyboardLayout touchesEnded:withEvent:]
UIKit -[UIWindow _sendTouchesForEvent:]
UIKit -[UIWindow sendEvent:]
UIKit -[UIApplication sendEvent:]
UIKit _UIApplicationHandleEvent
GraphicsServices PurpleEventCallback
CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__
CoreFoundation __CFRunLoopDoSource1
CoreFoundation __CFRunLoopRun
CoreFoundation CFRunLoopRunSpecific
CoreFoundation CFRunLoopRunInMode
GraphicsServices GSEventRunModal
GraphicsServices GSEventRun
UIKit -[UIApplication _run]
UIKit UIApplicationMain
APP main (main.m:XXX)
我在整个应用程序的各个位置尝试过这个键盘,包括在加载主视图之前的安全屏幕上,以及在其委托中注释掉的所有输入处理方法。失败是一致的。当实现委托方法并且我逐步执行textField:shouldChangeCharactersInRange:replacementString:时,收到的字符串是有效的。
一切似乎表明这是一个Apple问题,但我发现没有其他关于此问题的在线报道。我的直觉说这是我的代码中的东西。任何人都可以提示吗?
答案 0 :(得分:0)
在使用方法调配时,此答案中的信息对于遇到类似问题的人最有用。有关方法调配的解释,请转到here。
我调整了pathForResource:ofType:在NSBundle中,我自己的方法搜索我的应用程序加载的每个包。它还会搜索我随应用程序附带的资源档案。现在出现问题:键盘通常从iOS内部专用的包中访问数据。我的混合方法无法访问这些,因此键盘会间歇性地失败,并且没有给出有关原因的有用信息。
要解决它,我改变了swizzled方法,以便在我的应用程序的方法找不到任何资源的情况下调用[NSBundle pathForResource:ofType:]的原始实现。
问题解决了。