从 UITextView 的菜单中选择和删除文本时崩溃

Posted

技术标签:

【中文标题】从 UITextView 的菜单中选择和删除文本时崩溃【英文标题】:Crash upon text selection and deletion from menu in UITextView 【发布时间】:2011-11-08 17:20:28 【问题描述】:

我的 UITextViews 在文本选择和删除时使应用程序崩溃。

剪切、复制和粘贴似乎都可以正常工作。日志中唯一的错误是:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIMenuController view]: unrecognized selector sent to instance 0xff85ac0'

它是一个普通的 UITextView,UIMenuController 没有被触动和自定义。有什么想法吗?

在模拟器和设备上的 ios 4.3 和 5.0 中发生。

没有更多启用僵尸的信息,除了我需要解释的堆栈跟踪。新的 Xcode 对此不太满意:

(0x356338bf 0x360ae1e5 0x35636acb 0x35635945 0x35590680 0x37c63925 0x3816b 0x1a557 0x3559222b 0x37a869a7 0x3559222b 0x31671943 0x35607a63 0x356076c9 0x3560629f 0x355894dd 0x355893a5 0x32073fed 0x3794d743 0x29d1 0x2990)

【问题讨论】:

未捕获的异常通常会将源代码编辑器打开到代码中的特定行。能贴出相关代码吗? 它不在我的代码中,但我会发布堆栈。 【参考方案1】:

UITextViewUITextField 默认使用 UIMenuController 的原因未记录(如果您找到文档,请纠正我,我会更新此答案)。如果您的 UIText*Delegate 实现 delete:,则会添加“删除”选项。当从菜单中选择“删除”时,您的字段的代表将被调用,并带有 delete: 消息。我通过在断点列表窗格中添加一个异常断点发现了这一点,它为我提供了原始异常没有的正确符号化的堆栈跟踪。导致崩溃是因为我使用delete:(id)sender 以需要使用发件人的方式服务栏按钮项目。我通过将delete: 重命名为deletePart: 来修复它。用户仍然可以通过选择“剪切”来删除文本。

【讨论】:

很棒的发现。有同样的问题。【参考方案2】:

view 发送到UIMenuController 意味着您可能将UIMenuController 分配到了它不应该去的地方。查看您是否将任何内容设置为等于 menuController(或任何您的实例变量名称),看看这是否会导致问题。

另外,这可能是代码中更早发生的过度释放,其中UIMenuController 恰好分配在以前被过早释放的东西占用的内存空间中。启用NSZombies,看看你的错误变成了什么。

【讨论】:

谢谢。请记住,我没有在代码中的任何位置创建 UIMenuController。这只是来自 UITextView 的默认行为。我马上试试 NSZombies。 另外,如果您回复shouldReplaceCharacters:inRange:,那也可能是一个值得关注的地方。 我不是,但我确实尝试添加 - 返回 YES - 以及我认为可能很关键的其他一些委托方法。

以上是关于从 UITextView 的菜单中选择和删除文本时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

无法从 iOS 中的 UITextView 获取已删除的字符

从Superview中删除时UITextView不会消失

获取我正在触摸的文本视图在哪个 UIcollectionviewcell

在 UITextView 中定义后取消选择单词

复制所有文本后隐藏复制和取消选择 UITextView 选项

如何在 iPhone SDK 的 UITextView 中控制粘贴菜单的放置