我的应用使用了多个UITextView
,我们收到了用户无法重现的崩溃报告。
崩溃报告没有(似乎)包含我们的任何代码,并且NSInvalidArgumentException
方法NSString
中的rangeOfComposedCharacterSequenceAtIndex:
崩溃了,我们没有直接调用代码,但似乎是由框架调用。
以下是崩溃报告:
0 CoreFoundation __exceptionPreprocess + 130
1 libobjc.A.dylib objc_exception_throw + 38
2 CoreFoundation -[NSException initWithCoder:]
3 Foundation -[NSString rangeOfComposedCharacterSequenceAtIndex:] + 88
4 UIKit __74-[UITextInputController _validCaretPositionFromCharacterIndex:downstream:]_block_invoke + 328
5 UIFoundation -[NSTextStorage coordinateReading:] + 36
6 UIKit -[UITextInputController _validCaretPositionFromCharacterIndex:downstream:] + 218
7 UIKit __52-[UITextInputController _characterPositionForPoint:]_block_invoke + 1112
8 UIFoundation -[NSLayoutManager(TextLocking) coordinateAccess:] + 46
9 UIKit -[UITextInputController _characterPositionForPoint:] + 224
10 UIKit -[UITextSelection setSelectionWithFirstPoint:secondPoint:] + 56
11 UIKit -[UITextInteractionAssistant(UITextInteractionAssistant_Internal) twoFingerRangedSelectGesture:] + 386
12 UIKit _UIGestureRecognizerSendActions + 196
13 UIKit -[UIGestureRecognizer _updateGestureWithEvent:buttonEvent:] + 1138
14 UIKit ___UIGestureRecognizerUpdate_block_invoke + 48
15 UIKit _UIGestureRecognizerRemoveObjectsFromArrayAndApplyBlocks + 218
16 UIKit _UIGestureRecognizerUpdate + 282
17 CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 20
18 CoreFoundation __CFRunLoopDoObservers + 284
19 CoreFoundation __CFRunLoopRun + 730
20 CoreFoundation CFRunLoopRunSpecific + 522
21 CoreFoundation CFRunLoopRunInMode + 106
22 GraphicsServices GSEventRunModal + 138
23 UIKit UIApplicationMain + 1136
24 main.m line 16
25 libdyld.dylib start + 2
(https://gist.github.com/timarnold/6981caa6a1ee2b98c2fe)
由于我不确切知道代码的哪一部分导致崩溃,我不确定哪些示例代码对发布有帮助。我更感兴趣的是,如果有人看到过这样的事情,或者可能会建议在何处或如何进一步调查此事。
通过执行以下操作,我能够重现此问题:
UITextView
添加一些文字,包括一个尾随的换行符(\n
)UITextView
重新启动第一响应者状态UITextView
分配第一响应者状态,然后点击将光标插入字符串的末尾(换行符的位置周围)之后应用程序崩溃了上述报告。
我试图在一个只有股票UITextView
的空Xcode项目中创建它而没有别的,并且无法这样做。似乎我的应用程序中发生了一些与UITextView
密谋的事情,导致此次崩溃。很想知道什么,但是这个问题在我的项目中得到了解决(因为我们对追踪换行符并不感兴趣,可以修剪它们,从而防止崩溃发生)。
如果有人可以在示例项目中重现这一点,如果这确实是UITextView
的错误,那么提交雷达会很棒。
感谢@ wattson12和@Johan Kool提供的解决方案。
答案 0 :(得分:4)
我今天遇到了同样的问题,我没有旧的设备,但是看看这是不同的< 7.0.3因为它现在非常可重复并且之前没有被拾取。我无法解释原因,但这是我注意到的和我使用的修复:
我看到点击文字视图时崩溃:
我的解决方法是从最后修剪换行符(我使用了while循环以避免删除任何前导换行符,但如果不是问题,stringByTrimmingCharactersInSet会没问题)
答案 1 :(得分:1)
将scrollEnabled设置为YES(默认值)为我们修复了崩溃。 对于UI,我们需要scrollEnabled为NO。但是,一个次优的UI比崩溃更好,因此这种类别方法仅适用于低于7.1的iOS版本
- (void)enableScrollIfBuggyOSVersion {
if ([[[UIDevice currentDevice] systemVersion] compare:@"7.1" options:NSNumericSearch] == NSOrderedAscending) {
[self setScrollEnabled:YES];
} else {
[self setScrollEnabled:NO];
}
}