Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 键盘名称的间歇性故障_Iphone_Keyboard - Fatal编程技术网

Iphone 键盘名称的间歇性故障

Iphone 键盘名称的间歇性故障,iphone,keyboard,Iphone,Keyboard,我有一个视图(实际上有几个),底部有一个标准的搜索栏。当用户触摸搜索栏时,我需要向上移动搜索栏,使其不被键盘隐藏,然后在键盘关闭时再次向下移动 我和其他人一样,通过观察UIKeyboardWillShowNotification和UIKeyboardWillHideNotification来实现这一点。从这些通知中,我得到了键盘的高度,这告诉我应该把搜索栏的底部边缘放在哪里。它可以完美地工作,除了少数情况下搜索栏没有动画,或者动画不够远,然后消失在键盘后面。在我和我的QA人员在iPhone和iP

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

我和其他人一样,通过观察
UIKeyboardWillShowNotification
UIKeyboardWillHideNotification
来实现这一点。从这些通知中,我得到了键盘的高度,这告诉我应该把搜索栏的底部边缘放在哪里。它可以完美地工作,除了少数情况下搜索栏没有动画,或者动画不够远,然后消失在键盘后面。在我和我的QA人员在iPhone和iPod上进行的数百次测试中,我已经看到过几次了。就有一次,当键盘打开时,我看到搜索栏从屏幕顶部飞出。我们从来没有在模拟器上看到过这些,而且我们在iPod上看到的比在iPhone上看到的更多。我们运行的是iOS 4.x,大部分是4.3.3

所以我可以想到两种可能性。一个是很少有
UIKeyboardWillShowNotification
未发送,另一个是通知中的数据错误。第二个例子将解释搜索栏从屏幕顶部飞出的一个例子

当然,我的代码也有可能以某种非常狡猾的方式出错;但是这个场景非常简单——进入视图并点击搜索栏——我看不出代码中的bug是如何导致这些罕见的间歇性故障的


如果有人能提供见解,我将不胜感激。

我终于找到了我问题的答案,这很有趣。为了切中要害,我的搜索栏动画设置到了错误的位置;在某些情况下,它仍然在键盘后面,而在另一些情况下,它离开了屏幕的顶部。这不是由通知中的错误数据引起的,而是由访问CGSize的height成员或CGPoint的y成员时出现的错误引起的

具体来说:在某些场景中,当您编写mySize.height时,生成的代码将访问mySize.width。如果您正在阅读,您将获得mySize.width的值;如果您正在写作,那么您将使用mySize.width。类似地,myPoint.y实际上访问myPoint.x

你可能永远看不到这个问题。我只在运行iOS 4.2.1的旧iPodtouch设备上看到了它,并且只在发布版本中看到了它,并且只在使用Apple LLVM Compiler 3.0进行编译时看到过它,有时也可能看到。但我向苹果公司报告,他们说这是他们正在解决的一个已知bug(#10043857)的复制品。连接几个点,我猜它在Xcode 4.2的编译器链中的某个地方


解决方法是获取CGSize或CGPoint结构的地址,然后使用指针算法访问所需的成员。为此,我编写了一组小助手函数,并在我的应用程序代码中调用它们。

我发现,键盘通知传递给您的rect无法根据设备的方向调整宽度和高度。是否确实正确地将坐标转换为包含搜索栏的视图坐标系?我在制作键盘动画时会考虑设备方向,只要我没有在运行4.2.1的旧iPod上运行版本,它就可以可靠地工作。