如何使用自定义NSTextStorage清除UITextView?[仅限iOS7]



我目前正在尝试创建一个类似SMS的屏幕,用户可以在其中编写一些文本并将其发送给其他用户。一切都按预期进行,直到我试图清除文本视图时遇到崩溃。我一直在试图找到解决这个问题的方法,但我在网上找不到足够的文档。所以它就在这里,希望你们中的一个人能知道解决这个问题的方法。


实现

我的UITextView是Peter Steinberger为iOS7实现的子类,我将它与自定义NSTextStorage子类一起使用,如objc.io的"Getting to Know TextKit"中所示,尤其是源代码,以便在消息中突出显示用户名。

在我的ViewController中,我这样配置我的文本存储:

self.textStorage = [[[MyCustomTextStorage alloc] init] autorelease]; [self.textStorage addLayoutManager:self.textView.layoutManager];

然后在我的TextView的委托方法中:

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text

我将输入存储在我的自定义TextStorage:中

[self.textStorage.string stringByReplacingCharactersInRange:range withString:text];

车祸

我可以通过self.textStorage.string检索文本,然后通过替换输入字符串范围中的字符来清除文本视图。这运行得很好,但当我再次尝试将TextView设置为第一响应程序时,应用程序会崩溃。

Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSCFString _getBlockStart:end:contentsEnd:forRange:stopAtLineSeparators:]: Range {5, 0} out of bounds; string length 0'

提到的范围是我之前清除的字符串的范围,所以看起来我可以清除显示,但我的TextStorage/TextView保留了对第一个编辑的范围/字符串的引用。


知道是什么导致了这次崩溃以及如何解决吗?感谢您的关注;在这一点上,任何帮助都是感谢的,所以如果你有一些建议,请随时发布。:)

它崩溃的原因是您使用的范围超出了textStorage中字符串的界限。如果您想清除text查看为什么不使用self.textStorage.string=@">

与您的情况相同。

我花了半天时间才解决。

  1. 您提供的示例是正确的。

  2. 您的应用程序不仅在清除时会崩溃,而且每次使用-setText:时也会崩溃。

  3. 它们不会崩溃,因为它们永远不会调用-setText:!!!

解决方案:

将您需要的所有TextKit人员添加到您的代码中,

像这样:

_textStorage = [[NSTextStorage alloc] init];
_layoutManager = [[NSLayoutManager alloc] init];
[_textStorage addLayoutManager:_layoutManager];
_textContainer = [[NSTextContainer alloc] init];
[_layoutManager addTextContainer:_textContainer];
_myTextView = [[UITextView alloc] initWithFrame:frame textContainer:_textContainer];

实际上,您错过了NSTextContainer,所以没有合适的容器来放入字符串,然后应用程序崩溃了。

也许你可以向这两个演示项目发送拉请求,以免错过领导其他人的机会。

替换文本后,请尝试:

[self setSelectedRange:NSMakeRange(0, 0)];

最新更新