键盘通知间歇性失败

时间:2011-07-05 15:33:37

标签: iphone keyboard

我有一个视图(实际上是其中几个),底部有一个标准搜索栏。当用户触摸搜索栏时,我需要向上移动搜索栏,使其不被键盘隐藏,然后在键盘被解除时再次向下移动。

我通过观察UIKeyboardWillShowNotificationUIKeyboardWillHideNotification以与其他人相同的方式做到这一点。从这些通知中,我得到键盘的高度,并告诉我在哪里放置搜索栏的下边缘。它运行得很完美,除了极少数情况下搜索栏没有动画,或者没有足够的动画,并且在键盘后面消失。在我和我的QA人员在iPhone和iPod上进行测试的几百次尝试中,我已经看过几次。只有一次,当键盘出现时,我看到搜索栏从屏幕顶部飞出。我们从未在模拟器上看到任何这种情况,我们在iPod上看到它比iPhone更常见。我们运行的是iOS 4.x,主要是4.3.3。

所以我可以想到两种可能性。一个是偶尔会发送UIKeyboardWillShowNotification,另一个是通知中的数据是错误的。第二个将解释搜索栏从屏幕顶部飞出的一种情况。

当然,我的代码可能会以某种非常狡猾的方式出错;但情况非常简单 - 进入视图并点击搜索栏 - 我无法看到代码中的错误如何导致这些罕见且间歇性的失败。

如果有人能提供见解,我将非常感激。

1 个答案:

答案 0 :(得分:0)

我终于找到了我的问题的答案,这很有意思。为了切入追逐,我的搜索栏动画到了错误的位置;在某些情况下,它仍然在键盘后面,而在其他情况下,它不在屏幕的顶部。这不是由通知中的错误数据引起的,而是由访问CGSize的高度成员或CGPoint的y成员的错误造成的。

具体来说:在某些情况下,当您编写mySize.height时,生成的代码会访问mySize.width。如果您正在阅读,则获得mySize.width的值;如果你正在写作,你就破坏了mySize.width。同样,myPoint.y实际上访问myPoint.x。

您可能永远不会看到此问题。我只在运行iOS 4.2.1的旧款iPod touch设备上看到它,并且仅在发布版本中看到它,并且仅在使用Apple LLVM Compiler 3.0进行编译时才会看到,然后可能仅在有时。但是我向Apple报告了这一点,他们说这是他们正在解决的已知错误(#10043857)的副本。连接几个点,我猜它是在Xcode 4.2的编译器链中的某个地方。

解决方法是获取CGSize或CGPoint结构的地址,然后使用指针算法访问所需的成员。我写了一组小辅助函数来实现这一点,我把它们全部都用在我的应用程序代码上。