2011-10-31 5 views
15

मुझे लगता है कि इस सवाल से पहले पूछा गया है, लेकिन मैं जवाब से संतुष्ट नहीं हूं, यानी इसे अक्षम कर रहा हूं। एक मौलिक अंतर है: अक्षम दृश्य घटनाओं को आग नहीं करता है, लेकिन एक पठनीय दृश्य के लिए, इसे अभी भी ईवेंट (जैसे टचअप इनसाइड) को आग लगाना चाहिए, और मुझे इसकी आवश्यकता है। केवल एक चीज जो मैं नहीं चाहता वह कुंजीपटल इनपुट है।आईफोन/आईपैड: UITextField को केवल पढ़ने के लिए कैसे (लेकिन अक्षम नहीं)?

कारण यह है कि मेरे पास कई इनपुट फ़ील्ड हैं, कुछ सीधे यूआईटीएक्स्टफाल्ड का उपयोग कर सकते हैं, अन्य नहीं हैं। मैं उन्हें समान दिखाना चाहता हूं। तो, मैं उन सभी को प्रदर्शित करने के लिए UITextField का उपयोग करना चाहता हूं। उनमें से कुछ को केवल पढ़ने की जरूरत है, ताकि मैं वैकल्पिक इनपुट के लिए टच अप इवेंट का उपयोग कर सकूं।

या ऐसा करने का एक बिल्कुल अलग तरीका हो सकता है?

संपादित करें: यह मेरे मोनो टच प्रोजेक्ट के लिए है। ऑब्जेक्ट-सी में मेरे पास बहुत सीमित ज्ञान है।

+0

सभी 'गैर-संपादन योग्य' टेक्स्ट फ़ील्ड को एक सामान्य टैग मान असाइन करना आसान है और इसे 'textFieldDidBeginEditing' विधि पर जांचें और उचित रूप से BOOL को वापस लौटें – Gokul

उत्तर

25

कहें कि आपके पास इंटरफ़ेस बिल्डर में बनाए गए टेक्स्ट फ़ील्ड से जुड़े 2 टेक्स्ट फ़ील्ड इंस्टेंस वेरिएबल्स हैं। आइए उन्हें myReadOnlyTextField और myEditableTextField पर कॉल करें। सुनिश्चित करें कि आप इंटरफेस बिल्डर में प्रत्येक पाठ फ़ील्ड की delegate संपत्ति को व्यू कंट्रोलर ("फ़ाइल का स्वामी") [1] पर कनेक्ट करें। अब, व्यू कंट्रोलर @implementation (.m फ़ाइल) में, textFieldShouldBeginEditing: विधि का उपयोग करें और यह निर्धारित करने के लिए कि आप किस टेक्स्ट फ़ील्ड को संपादन की अनुमति देना चाहते हैं और संपादन की अनुमति नहीं देनी है, कुछ तर्क डालें; कुछ इस तरह:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { 
    BOOL editable; 
    if (textField == myReadOnlyTextField) { 
     editable = NO; 
    } else if (textField == myEditableTextField) { 
     editable = YES; 
    } else { 
     // editable = YES/NO/Other Logic 
    } 
    return editable; 
} 

UITextFieldDelegate Documentation से:

textFieldShouldBeginEditing:
प्रतिनिधि पूछता है कि संपादन निर्दिष्ट पाठ क्षेत्र में शुरू करना चाहिए।

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField

पैरामीटर
textField - पाठ क्षेत्र है जिसके लिए संपादन है के बारे में शुरू करते हैं।

वापसी मूल्य
YES अगर एक संपादन सत्र शुरू किया जाना चाहिए; अन्यथा, NO संपादन को अस्वीकार करने के लिए।

चर्चा
उपयोगकर्ता कोई ऐसा कार्य है कि सामान्य रूप एक संपादन सत्र आरंभ होगा करता है, पाठ क्षेत्र इस विधि पहले देखें कि संपादन वास्तव में आगे बढ़ना चाहिए कहते हैं। ज्यादातर परिस्थितियों में, आप संपादन को आगे बढ़ने की अनुमति देने के लिए इस विधि से बस YES वापस कर देंगे।

प्रतिनिधि द्वारा इस विधि का कार्यान्वयन वैकल्पिक है। यदि यह मौजूद नहीं है, तो संपादन की प्रक्रिया जैसे कि इस विधि ने YES वापस कर दिया था।

UITextField Documentation एक अच्छा पढ़ा भी है।


[1] आप इस प्रोग्राम के रूप में रूप में अच्छी तरह से कर सकते हैं।

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // ..... 
    myReadOnlyTextField.delegate = self; 
    myEditableTextField.delegate = self; 
} 
+0

आपकी त्वरित प्रतिक्रिया के लिए बहुत बहुत धन्यवाद। मुझे खेद है कि मैं अपने प्रश्न में उल्लेख करना भूल गया कि मैं मोनो टच प्रोजेक्ट में काम कर रहा हूं। मेरे सीमित ऑब्जेक्ट-सी ज्ञान से, मुझे समझ में नहीं आता कि आप यहां क्या करने की कोशिश कर रहे हैं। दरअसल, यदि संभव हो तो मैं एक साधारण समाधान की तलाश में हूं (जैसे संपत्ति स्थापित करना)। यदि यह काम करने के लिए इतना कोड लेता है, तो शायद मैं एक अलग समाधान खोजने की कोशिश करूंगा। – newman

+1

कोड की एक दर्जन या तो लाइनें आपके लिए बहुत अधिक हैं? और जिस तरह से आप एक संपत्ति, प्रतिनिधि संपत्ति स्थापित कर रहे हैं। और वह प्रतिनिधि मौसम का फैसला करता है कि आप मैदान को संपादित कर सकते हैं। – NJones

+8

@ मिलि, कोई अपराध नहीं, लेकिन यह सही जवाब है। इसे लागू करने के लिए समय क्यों नहीं लेते हैं और शायद इसे करने के दौरान कुछ उद्देश्य सी सीखते हैं? – sosborn

14

सच है कि आप कोई कुंजीपटल की जरूरत के बावजूद, textField:shouldChangeCharactersInRange:replacementString: बहुत उपयोगी है: यहाँ एक उदाहरण है। यह टेक्स्ट फ़ील्ड को संपादन से रोकता है लेकिन फिर भी इसे textFieldShouldBeginEditing: के विपरीत चुनने योग्य छोड़ देता है।

monotouch में:

var txt = new UITextField(); 
txt.ShouldChangeCharacters += (field, range, replacementString) => false; 
+2

कस्टम दृश्य (उदाहरण के लिए एक दिनांक पिकर) के साथ इनपुट व्यू (कीबोर्ड) को प्रतिस्थापित करते समय यह उपयोगी होता है। – andref

1

क्योंकि आप MonoTouch में काम कर रहे हैं आप निम्न कोड पंक्ति इस्तेमाल कर सकते हैं: एक) वापसी के साथ ShouldBeginEditing उपयोग करने के लिए:

myReadOnlyButton.ShouldBeginEditing = t => 
{ 
    //event code 
    return false; 
}; 
2

आपके पास दो विकल्प हो सकता है झूठा, लेकिन आप अपने टेक्स्ट फ़ील्ड में पिकर व्यू को इनपुट व्यू के रूप में उपयोग नहीं कर सकते हैं। बी) CanChangeCharacters का उपयोग करने के लिए जो संपादन को रोक देगा लेकिन पिकर व्यू के साथ इनपुट व्यू का उपयोग करने की अनुमति देगा।

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