UItextView 委托方法未在子视图内调用

Posted

技术标签:

【中文标题】UItextView 委托方法未在子视图内调用【英文标题】:UItextView Delegate methods not called inside subview 【发布时间】:2012-10-29 19:15:19 【问题描述】:

简而言之:

在 ClassA_VC 我做:

ClassB_VC *classB_VC=[ClassB_VC alloc]initWithNibName:@"ClassB_VC" bundle:nil];
[self.view addSubview:classB_VC.view];

然后在 ClassB_VC 中我有一个 UITextField。我在 IB 中设置了文本字段和文件所有者之间的委托连接,我在@interface 声明中添加了协议方法(textFieldDidEndEditing、textFieldDidBeginEditing 等)。

这应该可以,但是当我触摸文本字段时出现异常。似乎文本字段没有到达它的委托。

但是,如果我使用 presentModalViewController 呈现视图,则一切正常。我宁愿不必这样做,因为这些视图位于 tabViewController 中,并且我不想在显示时隐藏 tabBar。

我希望你明白我想说什么。我的英语不是很好。

【问题讨论】:

完整的异常消息会很有帮助。由于 UITextFieldDelegate 的所有方法都是可选的,接口文件中的协议引用或委托方法签名拼写错误应该不是问题,它看起来更像是内存问题。 嗯,这就是重点。没有消息,只是冻结。我得到的只是线程 1 的跟踪显示了这些最后几行: 0 objc_msgSend 1 -[UITextField canBecomeFirstResponder] 2-[UIResponder becomeFirstResponder] 3 -[UITextInteractionAssistant setFirstResponderIfNecessary] 似乎添加的视图不是第一响应者。我试图在 viewDidLoad 中强制 [self.view becomeFirstResponder] 但仍然相同。如果我从委托中取消链接 UITextField 它不会崩溃但我无法隐藏键盘等... 您可能在委托方法的某处创建了无限循环,请尝试将它们全部注释掉。如果问题仍然存在,您将需要检查 InterfaceBuilder 连接,它足够聪明,不会让您将 UITextField 插座链接到其他类型的插座,但您可能在创建连接后手动更改了插座类。或者您是否在代码中手动为此插座设置任何内容? 【参考方案1】:

ClassA_VC 中是否保留 ClassB_VC?

【讨论】:

是的!这样做的伎俩。这似乎很明显......现在。 :D 我不明白为什么会这样。视图不会从屏幕上卸载或移除。 :| 谢谢大家的回答。 视图被保留被添加到其他视图,第二个视图控制器,也是 textView 委托,没有被任何东西保留。所以发生的事情是 viewController 被释放了 - 它释放了它的出口,但它们在保留它们的视图堆栈中,这就是视图 没有 被释放但视图控制器作为委托 的方式 已解除分配。当您将 viewController 的视图显示为模态时,控制器会被保留并且控制器不会被释放。希望现在清楚了。 非常感谢A-Live的解释。现在很清楚了。 :D【参考方案2】:

从界面生成器中删除委托并执行此操作:

ClassB_VC *classB_VC=[ClassB_VC alloc]initWithNibName:@"ClassB_VC" bundle:nil];
[classB_VC.yourTextField setDelegate:classB_VC];
[self.view addSubview:classB_VC.view];

如果有帮助请告诉我

【讨论】:

它没有用。我前段时间已经遇到过这个问题,我不得不将 ClassB 中的视图和方法包含到 ClassA 中,并在需要时将其隐藏起来。这对我来说似乎很乱。处理这个问题一定非常非常容易,但我在这里遗漏了一些明显的东西。

以上是关于UItextView 委托方法未在子视图内调用的主要内容,如果未能解决你的问题,请参考以下文章

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

未在委托上调用 CAAnimation 委托方法

如何在 XIB 中调用 UITextField 的委托方法?

MonoTouch - UIView.Animate 完成回调未在按钮 touchUpInside 委托内调用

UITextView 类中未调用 UIAlertView 委托方法

UITextView 委托 shouldChangeTextInRange (或任何以上)不会被调用