2011-10-20 50 views
6

在試圖Detect backspace in UITextField, 我試過繼承UITextField and overriding -[UIKeyInput deleteBackward],但它永遠不會被調用。所以,我懷疑UITextField swizzles deleteBackward到另一個方法的名稱。Objective-C運行時:Swizzled方法名稱?

使用Objective-C Runtime,我怎樣才能確定哪個方法名稱deleteBackward已被調試?那麼,如何更改執行方式,以便UITextField將在空鍵時按下刪除鍵時調用[self.delegate textField:self shouldChangeCharactersInRange:NSMakeRange(0, 0) replacementString:@""]

此外,這種元編程會讓我的應用程序在App Store中被拒絕嗎?

+0

+1,因爲這是一個看似很難的問題。 – NJones

+0

你有沒有解決這個問題?我有同樣的問題。 – MdaG

回答

3

Swizzling不會更改方法的名稱。如果確實如此,則不可能調用該方法,因爲運行時將使用該名稱查找實現。它所做的只是更改調用特定方法時運行的代碼的地址。

我的猜測爲什麼deleteBackward方法沒有被調用是因爲輸入系統使用的是更復雜的UITextInput協議,而最有可能的是replaceRange:withText:。當text參數爲空字符串時,嘗試調整並執行呼叫。另外請確保您的混搭功能不會返回錯誤。

+0

但[[UITextInput'](http://developer.apple.com/library/IOS/#documentation/UIKit/Reference/UITextInput_Protocol/Reference/Reference.html#//apple_ref/occ/intf/UITextInput)符合[ 'UIKeyInput'](http://developer.apple.com/library/IOS/documentation/UIKit/Reference/UIKeyInput_Protocol/Reference/Reference.html#//apple_ref/occ/intf/UIKeyInput),它需要'deleteBackward'被執行。那麼,不應該要求'UITextField'來實現'deleteBackward'? – ma11hew28

+0

此外,在我的UITextField的子類(和我的類)中,我只用'NSLog'實現了'replaceRange:withText:'來查看它是否被調用,而不是。 – ma11hew28

+0

@Matt是的,它要求'deleteBackward'被實現,但並不一定意味着它會被使用。這只是一種可能性。然而,重讀你的問題,我注意到你只是在空的時候擔心。如果兩個方法都不是空的,它們會被調用嗎?也許輸入系統不會告訴文本字段關於按鍵,如果它是空的。 – ughoavgfhw

相關問題