2011-02-07 19 views
9

यदि मैं UITextField में परिवर्तनों को संभालना चाहता हूं, जैसे उपयोगकर्ता इसमें टाइपिंग; ऐसा लगता है कि यह उस टेक्स्ट फ़ील्ड में एक प्रतिनिधि को असाइन करके किया जा सकता है, और उसके बाद प्रतिनिधि को लागू करना चाहिए चेंज चेंक्टर्स इनरेंज, या टेक्स्ट फ़ील्ड में लक्ष्य जोड़कर, और UIControlEventEditingChanged ईवेंट को संभालना।UITextFieldDelegate बनाम UITextField नियंत्रण घटनाओं

इस तथ्य के अलावा कि प्रतिनिधि विधि के साथ, आप उपयोगकर्ता को संपादन करने से रोकने के लिए नहीं कर सकते हैं, क्या इन 2 चीजों के बीच कोई अंतर है?

संपादन की शुरुआत या संपादन के अंत को संभालने के लिए एक ही सवाल। यह उचित प्रतिनिधि विधियों या उपयुक्त घटनाओं के साथ किया जा सकता है। टेक्स्टफाइल प्रतिनिधि वास्तव में क्या है यदि नियंत्रण घटनाएं आवश्यक कार्य कर सकती हैं?

उत्तर

6

आप सही हैं; आप अनिवार्य रूप से दोनों के माध्यम से एक ही काम कर सकते हैं, लेकिन यूआईसींट्रोल कम स्तर है और आपको प्रत्येक विशेष UIEvent को [UIControl addTarget:action:forControlEvents:] के माध्यम से अलग-अलग लक्ष्यों को बंद करने देता है, जहां केवल एक ही प्रतिनिधि होता है।

मैं भी कहूँगा कि UITextField delegate protocol एक और अधिक सुविधाजनक, उच्च स्तर UIControl/UIEvent करने के लिए एक UITextField के व्यवहार का प्रबंधन करने के एक तरीके के रूप विकल्प के रूप में बस नहीं है।

सबसे आम प्रतिनिधि पैटर्न UITableView डेटा स्रोत और प्रतिनिधि है और मैं कहूँगा कि UITextField प्रतिनिधि प्रोटोकॉल का उपयोग काफी समान है और इसलिए सीधे UIControl से संदेश सौंपने की तुलना में अधिक परिभाषित इरादों के साथ कहीं अधिक सीधे आगे लग रहा है।

9

shouldChangeCharactersInRange किसी बदलाव से पहले कहा जाता है, और आपको परिवर्तन को 'रद्द' करने का मौका देता है। परिवर्तन के बाद UIControlEventEditingChanged कहा जाता है।

आप shouldChangeCharactersInRange में टेक्स्ट फ़ील्ड के परिणामी मान को निर्धारित कर सकते हैं, लेकिन आपको आपूर्ति की गई सीमा का उपयोग करके मौजूदा टेक्स्ट में प्रतिस्थापन स्ट्रिंग को मैन्युअल रूप से लागू करना होगा। (NSString stringByReplacingCharactersInRange के माध्यम से)। यदि आप परिणामी पाठ को जानना चाहते हैं, तो UIControlEventEditingChanged का उपयोग करना आसान और अधिक कुशल है।

shouldChangeCharactersInRange अक्सर इनपुट की सत्यापन जांच को लागू करने के लिए उपयोग किया जाता है - यानी, आप अक्षरों/चिपकाए गए पाठ को दर्ज किए जाने के रूप में फ़िल्टर कर सकते हैं। यदि कोई फ़ील्ड फोन नंबरों के लिए है, उदाहरण के लिए, यदि उपयोगकर्ता गैर-संख्यात्मक वर्ण टाइप करता है, या टेक्स्ट में पेस्ट करने का प्रयास करता है जो संख्यात्मक नहीं है, तो आप FALSE वापस कर सकते हैं।

अगर आप UIControlEvent-methods.

1

प्रतिनिधिमंडल दृष्टिकोण के साथ छड़ी कर सकते हैं आप एक मामले में जहां आप एक से अधिक नियंत्रण के लिए कोड का पुन: उपयोग कर सकते हैं जिस तरह से मिल सकती है homogenize करने के लिए UITextField और UITextView व्यवहार है।

UITextView में नियंत्रण घटनाएं नहीं हैं। इसके विपरीत, UITextFieldDelegate और UITextviewDelegate समानांतर विधियां प्रदान करते हैं।

0

मुझे पता चला है कि shouldChangeCharactersInRange टेक्स्ट के सम्मिलन और हटाने के लिए NSRange पास करता है। आप एक स्पेस जोड़ते हैं और फिर इसे हटाते हैं, और shouldChangeCharactersInRange के पैरामीटर टेक्स्ट के डुप्लिकेशंस से अलग नहीं हैं।

तो shouldChangeCharactersInRange वास्तव में परिणामी पाठ की भविष्यवाणी नहीं कर सकता है।

6

एक मुख्य अंतर यह है कि मैं मूल प्रश्न में उत्पन्न दो दृष्टिकोणों के बीच पाया है प्रतिनिधि "shouldChangeCharactersInRange" पहले UITextField परिवर्तन में मूल्य कहा जाता हो जाता है। UIControlEventEditingChanged के लिए लक्ष्यUITextField परिवर्तन में मूल्य के बाद कहा जाता हो जाता है।

इस मामले में आप सुनिश्चित करने के लिए इन घटनाओं का उपयोग कर रहे हैं (उदाहरण के लिए) कि "पूर्ण" बटन सक्षम करने से पहले एक संवाद में सभी फ़ील्ड पूरी तरह से भरे हुए हैं, लक्ष्य दृष्टिकोण आपके लिए बेहतर काम कर सकता है। यह मेरे लिए किया था।