2011-07-05 47 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版本,它就可以可靠地工作。 –