UITextView 委托问题

Posted

技术标签:

【中文标题】UITextView 委托问题【英文标题】:UITextView delegates problem 【发布时间】:2010-09-23 14:16:39 【问题描述】:

我正在尝试访问 UITextView 委托并遇到问题

我有一个带有 UITextViewDelegate 协议的 UIViewController 和一个包含 textView 的 Nib。

如果我在 viewDidLoad 中设置委托(如“textView.delegate = self”)并触摸 textView,则应用程序会崩溃而不会记录错误。 如果我开始使用“[textView becomeFirstResponder]”之类的代码编辑 textView,则所有代表都会被调用。

当我在 Nib 中设置委托时,在 textView 和文件所有者之间创建连接并删除“textView.delegate = self”时,也不会调用任何委托。

我在这里做错了什么?

问候,

埃利亚斯

【问题讨论】:

您确定“文件的所有者”是正确的文件吗?另外,你在调用什么委托方法?请发布一些代码。 【参考方案1】:

如果没有更多的描述、发布的代码或 xib 文件,帮助您并不容易。

您说应用程序崩溃而没有任何日志记录错误 - 好吧,您的意思是控制台窗口中没有输出吗?这是正常的,对于一个已经崩溃的应用程序。

无论如何,您应该能够获得堆栈跟踪以找出应用程序崩溃的大致位置。打开调试器(⇧⌘Y),查看位置。这应该让您知道出了什么问题。

您可以在此处查看此类调试器会话的示例(在 EXC_BAD_CRASH 之后):

前两行没有给我们太多信息,但稍后我们可以看到应用程序在从 NIB 文件加载用户界面时崩溃了。好吧,通常在这种加载期间执行的唯一代码是 awakeFromNib 方法 - 由你来找到这些方面的问题。

通常代码执行的顶部没有任何意义 - 例如,您可能会在某处看到您的 ViewController 方法,但顶部的几个函数调用(代码崩溃的那些)位于您从未调用过的方法/类中代码。在大多数情况下,这是错误的内存释放/分配的标志。可能发生的情况是您忘记了retain 您的一些对象,它已经被释放,但您仍然保留对其内存的引用(指针)。因为该内存实际上已被释放,后来另一个对象取而代之,通常是一些您从未听说过的 Apple 内部对象。稍后您的代码会尝试向您的可怜对象发送消息,但它会向完全不同的对象发送消息。太糟糕了!这就是你得到那些崩溃和奇怪的堆栈跟踪的方式。

要解决我刚才描述的问题,您可以使用 Instruments 及其 Zombies 工具。不幸的是,你不能从 Xcode 中启动 Zombies,你需要独立启动 Instruments,然后选择 iPhone Simulator/Memory 下的 Zombies,然后从工具栏中选择 Choose Target,你应该在那里看到你的应用程序,或者能够导航到它在文件系统上。

Zombies instrument 的作用是在对象被释放后它永远不会真正释放内存。相反,它会将这些对象变异为 NSZombie 类。该类拦截对自身的所有调用,并在某些代码尝试向其发送消息时通知您。

这就是 Instruments 会话的样子(这与上面调试器中看到的崩溃相同):

在表格中,您可以看到我们正在尝试向已释放的 UIScrollView 发送消息。您还可以查看对该特定对象的保留/释放调用的整个历史记录。这样您就可以找到丢失的保留或错误的释放/自动释放。

记住 - Zombies Instruments 只能与模拟器一起使用,因为真实设备上没有足够的内存来保存所有这些内存块。

希望我能帮助您进一步分析您的问题。

【讨论】:

以上是关于UITextView 委托问题的主要内容,如果未能解决你的问题,请参考以下文章

iOS UITextView 委托

UITextView 的自定义委托

UItextView 委托 swift - textViewDidBeginEditing 未调用

堆叠的 UIViewControllers 中的 UITextView 委托问题

iphone设置UITextView委托打破自动完成

UITextView 委托未获得所有方法调用