2011-07-05 46 views
1

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

我这样做的方式与其他人一样,通过观察UIKeyboardWillShowNotificationUIKeyboardWillHideNotification。从这些通知中,我得到了键盘的高度,并告诉我在哪里放置搜索栏的底部边缘。它完美的工作,除了罕见的情况下,当搜索栏没有动画,或动画不够远,消失在键盘后面。在我和我的QA人员在iPhone和iPod上进行测试的数百次尝试中,我已经看到了这一次。只有一次,当键盘出现时,我看到搜索栏飞出屏幕顶部。我们从来没有在模拟器上看到过这种情况,我们在iPod上看到的频率比iPhone要高。我们正在运行iOS 4.x,主要是4.3.3。

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

然后当然有可能我的代码在一些非常迂回的方式是错误的;但情景非常简单 - 进入视图并点击搜索栏 - 我无法看到代码中的错误如何导致这些罕见的间歇性故障。

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

回答

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进行编译时,才有时可能。但是我向苹果报告,他们说这是他们正在解决的已知错误(#10043857)的重复。连接几个点,我猜测它在Xcode 4.2的编译器链中。

解决方法是获取CGSize或CGPoint结构的地址,然后使用指针算术访问所需的成员。我编写了一套小帮助函数来完成这个任务,并且我把它们全称为我的应用代码。

+0

我发现键盘通知给你的矩形不适应宽度和高度的设备的方向。您确定您正确地将坐标转换为包含搜索栏的视图的坐标系吗? –

+0

我在做键盘动画时考虑了设备的方向,只要我不在运行4.2.1的旧版iPod上运行Release版本,它就可以可靠地工作。 –