1% 的时间没有处理 UIButton 事件:我应该在我的响应链中责备谁?
Posted
技术标签:
【中文标题】1% 的时间没有处理 UIButton 事件:我应该在我的响应链中责备谁?【英文标题】:UIButton event not handled 1% of the time: who should I blame in my responder chain? 【发布时间】:2012-03-14 03:23:32 【问题描述】:我的应用程序有时会忘记响应者应该处理触摸事件。
我的情况:
定义 3 个视图的 XIB 文件: 一个视图作为文件所有者的视图 以编程方式添加到视图层次结构中的 2 个额外视图 其中一个子视图 (SubviewA) 有一个UIButton
,配置为在检测到“Touch Up Inside”事件时将 myAction:
选择器发送到 FirstResponder
SubviewA 知道如何处理myAction:
99% 的时间,一切都很好。当用户点击按钮时,SubviewA 会处理 myAction:
消息,一切都很好。但时不时地,用户抱怨按钮“冻结”,实际上我自己复制了几次,却无法找到一个清晰的场景来按需实现。
到目前为止我的调查是:
当点击按钮没有任何反应时: 我的按钮检测到点击,因为按下时它会突出显示 未在 SubviewA 上调用myAction:
UI 的其余部分保持响应式
我所说的代码是我正在尝试修复的一些遗留代码。让视图响应其子视图之一的事件对我来说听起来像是一种奇怪的架构。到目前为止,我一直使用 File's Owner 来处理触摸事件,因此我指出响应者链是解决该错误的理想选择。但我找不到原因!据我了解,由于按钮不知道如何处理消息并且没有附加视图控制器,它应该将其转发到其父视图(ButtonA,知道如何处理它)!
我的问题是:
知道错误可能来自哪里吗? (响应链?) 关于视图是否应自行处理其按钮行为或视图控制器是否应处理的任何评论?编辑: 我对如何修复错误有一个想法:将按钮操作直接连接到 SubviewA,而不是在 Interface Builder 中使用 FirstResponder。我发布这个问题的原因是试图理解为什么响应者链有时不工作。
【问题讨论】:
不涉及.m代码:只是XIB文件,不太容易分享。 【参考方案1】:你可以让 SubviewA 成为FirstResponder,然后在完成后放弃它吗?
【讨论】:
我修复错误的计划是将按钮操作直接连接到 SubviewA,而不是连接到 Interface Builder 中的 FirstResponder。我想知道的是为什么它不能与 FirstResponder 一起使用。【参考方案2】:在子视图中处理触摸时,它们通常不会向上传递。因此,例如,如果您在内容视图的视图控制器中捕捉到触摸,您将接触到 UILabel,因为它没有捕捉到它们。这些事件被传递给内容视图,然后传递给控制器。但是你不会在 UIButton 上看到任何触摸,因为该类正在捕获它们(请记住,UIButton 解释了许多触摸序列,而不仅仅是内部触摸)。
因此,您需要将 UIButton 子类化以查看触摸。当您这样做时,请务必在完成后始终将事件传递给超类,否则 UIButton 将无法正常工作。请参阅UIControl Class Reference 中的子类化注释。还请查看Control Events in that reference,以及一些实例方法,以确保您确实需要捕捉代码中的内容。例如,请注意,UIButton 从 UIControl 继承了跟踪触摸的能力。
【讨论】:
您的回答是有道理的,但忽略了我的问题的重点:我的 xib 文件明确告诉我的按钮在第一响应者上调用 myAction 以进行内部修饰事件。那为什么有时会错过呢?以上是关于1% 的时间没有处理 UIButton 事件:我应该在我的响应链中责备谁?的主要内容,如果未能解决你的问题,请参考以下文章
我应该处理 WSASend() 可能不会发送所有数据的事实吗?