2011-10-20 10 views
6

Detect backspace in UITextField, के प्रयास में मैंने UITextField and overriding -[UIKeyInput deleteBackward] उपclassing करने की कोशिश की है, लेकिन इसे कभी नहीं कहा जाता है। तो, मुझे UITextField पर संदेह है कि deleteBackward अन्य विधि नाम पर swizzles।उद्देश्य-सी रनटाइम: स्विज्जाइड विधि का नाम?

Objective-C Runtime का उपयोग करके, मैं कैसे निर्धारित कर सकता हूं कि किस विधि का नाम deleteBackward पर जा रहा है? फिर, मैं कार्यान्वयन कैसे बदल सकता हूं ताकि UITextField[self.delegate textField:self shouldChangeCharactersInRange:NSMakeRange(0, 0) replacementString:@""] पर कॉल करेगा जब डिलीट कुंजी खाली होने पर दबाया जाता है।

इसके अलावा, क्या इस तरह के मेटाप्रोग्रामिंग को ऐप स्टोर से मेरा ऐप खारिज कर दिया जाएगा?

+0

+1, क्योंकि यह एक भ्रामक रूप से कठिन सवाल है। – NJones

+0

क्या आपने कभी इसे हल किया है? मुझे भी यही तकलीफ़ है। – MdaG

उत्तर

3

स्विजलिंग एक विधि का नाम नहीं बदलता है। यदि ऐसा होता है, तो विधि को कॉल करना असंभव होगा, क्योंकि रनटाइम नाम का उपयोग करके कार्यान्वयन पाता है। यह सब उस कोड का पता बदलता है जो एक विशिष्ट विधि को कॉल करते समय चलाया जाता है।

मेरा अनुमान है कि deleteBackward विधि क्यों नहीं कहा जा रहा है कि इनपुट सिस्टम अधिक जटिल UITextInput प्रोटोकॉल से एक विधि का उपयोग कर रहा है, संभवतः replaceRange:withText:text तर्क एक खाली स्ट्रिंग है जब swizzling और अपने कॉल प्रदर्शन करने का प्रयास करें। यह भी सुनिश्चित करें कि आपके स्विजलिंग फ़ंक्शन में कोई त्रुटि नहीं आती है।

+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' की आवश्यकता नहीं होनी चाहिए? – ma11hew28

+0

इसके अलावा, 'यूआईटीएक्स्टफिल्ड' के मेरे सबक्लास (और मेरी श्रेणी में) में, मैंने 'replaceRange: withText: 'को लागू किया है, यह देखने के लिए कि क्या इसे कॉल किया गया है, और यह नहीं है। – ma11hew28

+0

@ मैट हां, यह आवश्यक है कि 'डिलीटबैकवर्ड' लागू किया गया हो, लेकिन इसका मतलब यह नहीं है कि इसका उपयोग किया जाएगा। यह सिर्फ एक संभावना थी। हालांकि, आपके प्रश्न को दोबारा पढ़ते हुए, मैंने देखा कि आप केवल खाली होने के बारे में चिंतित हैं। क्या यह विधि खाली है अगर यह खाली नहीं है? हो सकता है कि अगर इनपुट खाली हो तो इनपुट सिस्टम कुंजीपटल के बारे में टेक्स्ट फ़ील्ड को नहीं बताता है। – ughoavgfhw

संबंधित मुद्दे