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

Posted

技术标签:

【中文标题】如何使用自定义 NSTextStorage 清除 UITextView? [仅限 iOS7]【英文标题】:How to clear a UITextView with a custom NSTextStorage? [iOS7 only] 【发布时间】:2014-01-13 17:41:22 【问题描述】:

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


实现

我的 UITextView 是 Peter Steinberger's implementation for ios7 的子类,我将它与自定义 NSTextStorage 一起使用,如 objc.io 的“了解 TextKit”中所示,尤其是 source code,以便在消息中突出显示用户名。

在我的 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 保留对第一个编辑范围/字符串的引用。


对可能导致此崩溃的原因以及如何解决它有任何想法吗? 感谢您的关注;在这一点上,任何帮助表示赞赏,所以如果您有任何建议,请随时发布。 :)

【问题讨论】:

【参考方案1】:

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

【讨论】:

嗨,我也试过了,但同样的崩溃发生了…… 您可能不应该在 shouldChangeTextInRange 委托方法中设置 textStorage.string。您应该只更正传入参数中的文本并返回 YES。【参考方案2】:

你的情况也一样。

花了我半天时间才解决。

    你提供的例子是对的。

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

    他们不会崩溃,因为他们永远不会打电话给-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,因此没有合适的容器可以放入字符串,然后应用程序崩溃了。

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

【讨论】:

【参考方案3】:

替换文本后,尝试:

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

【讨论】:

以上是关于如何使用自定义 NSTextStorage 清除 UITextView? [仅限 iOS7]的主要内容,如果未能解决你的问题,请参考以下文章

如何清除包含在重复使用的自定义 UITableViewCell 中的 WKWebview?

如何在不造成内存泄漏的情况下清除自定义对象的 NSMutableArray?

当我导航到其他路由器页面时,如何清除由错误边界创建的自定义消息

PowerShell如何清除当前ISE窗口的自定义变量

如何将历史记录彻底清除掉

如何彻底清除电脑历史记录