2009-04-10 11 views
7

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

  • मैं एक वर्ग पोर्ट कहा जाता है कि एक सीरियल पोर्ट का प्रतिनिधित्व करता है:

    उपयोग के मामले मैं मन में है इस प्रकार है।

  • गुणों में से एक नाम फ़ील्ड है।
  • एनएसपीओपअप बटन में मैं प्रत्येक बंदरगाह के लिए नाम फ़ील्ड प्रदर्शित करना चाहता हूं।
  • जब कोई उपयोगकर्ता एक विशिष्ट बंदरगाह का चयन करता है तो इसे पॉप-अप में चिह्नित किया जाता है, जैसा कि अपेक्षित
  • जब उपयोगकर्ता बाद में एक कनेक्ट बटन हिट करता है तो मैं यह पता लगा सकता हूं कि ऐरे से कौन से बंदरगाहों का चयन किया गया था।
  • मैं इसे बाइंडिंग का उपयोग करके प्राप्त करना चाहता हूं क्योंकि मुझे लगता है कि एक बार जब मैं इसके चारों ओर अपना सिर लेता हूं, तो यह अधिक सुरुचिपूर्ण समाधान होगा। मेरी मीटर में

    NSMutableArray *allPorts; 
    Port *currentlySelectedPort; 
    

    और एक कार्रवाई:

इसलिए मेरी AppController.h में मैं दो गुण जो मैं शायद गुण के रूप में बना सकते हैं और संश्लेषण कर सकते हैं उम्मीद कर रहा हूँ

-(void)didSelectConnect:(id)sender{ 
    NSLog(@"Selected port name is:%@",[currentlySelectedPort name]); 
} 

में Port.h मेरे पास

NSString *name; 
NSString *baudRate; 
... etc ... 

I ha हमने एक साधारण प्रोजेक्ट बनाया है जिसमें केवल एक पॉप अप (और एक लेबल) शामिल है और विभिन्न लेखों का पालन करने के बाद, मैंने तत्वों के साथ एक एनएसएमयूटेबलएरे को पॉप्युलेट करने में कामयाब रहा है, जिसे मैं मान प्रदर्शित करने के लिए एक ऐरे कंट्रोलर का उपयोग करता हूं और फिर चयन पर लेबल के मान को सेट करता है (एक ऑब्जेक्ट नियंत्रक का उपयोग कर)। हालांकि, जितना अधिक चालाक है, यह उपयोग के मामले में फिट नहीं है जिसे मैं कार्यान्वित करने की कोशिश कर रहा हूं। तो मैं मदद

एम

+0

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

उत्तर

11

ठीक के लिए यहाँ की बारी है, NSPopUpButton साथ बाइंडिंग थोड़ा जटिल क्योंकि वहाँ दो बातें इसकी आवश्यकता हैं: मूल्यों के लिए एक बाध्यकारी है, और एक बाध्यकारी जिसके लिए उन मूल्यों में से एक का चयन किया गया । इससे और भी जटिल यह है कि ऐसा करने के कुछ पूरी तरह से वैध तरीके हैं, और आप जो भी चुनते हैं वह पूरी तरह से आपके कार्यक्रम की संरचना और कुछ हद तक व्यक्तिगत प्राथमिकताओं पर निर्भर करता है।

तो, मानों की सूची प्राप्त करने के लिए, आप content संपत्ति को बाध्य करते हैं। आपके मामले में, आप शायद NSArrayController की arrangedObjects कुंजी पर बाध्य करेंगे। इस सेटअप में, प्रत्येक मेनू आइटम एक ऑब्जेक्ट का प्रतिनिधित्व करता है। डिफ़ॉल्ट रूप से, मेनू आइटम का शीर्षक सरणी में प्रत्येक आइटम पर description पर कॉल करके लौटाई गई स्ट्रिंग है। यदि आप मेनू शीर्षक के लिए एक अलग संपत्ति का उपयोग करना चाहते हैं, तो आप contentValues सरणी को भी बांध सकते हैं। बस सुनिश्चित करें कि कुंजी पथ आप contentValues के लिए निर्दिष्ट content का उपसर्ग के रूप में के लिए महत्वपूर्ण पथ (उदाहरण के लिए आप contentValues के लिए content और arrangedObjects.name के लिए arrangedObjects उपयोग कर सकते हैं)

यह आपको मेनू आइटम है कि वस्तुओं का प्रतिनिधित्व देना हो जाए। आपको जो चाहिए वह चयनित व्यक्ति की पहचान करने का कोई तरीका है। तीन अलग-अलग बाइंडिंग आप उपयोग कर सकते हैं: selectedIndex, selectedObject और selectedValue।वे क्रमशः, उपयोगकर्ता द्वारा चयनित सरणी ऑब्जेक्ट की अनुक्रमणिका, ऑब्जेक्ट वैल्यू (content सरणी में ऑब्जेक्ट्स में से एक) का प्रतिनिधित्व करते हैं, और चयनित आइटम का स्ट्रिंग शीर्षक (contentValues सरणी में ऑब्जेक्ट्स में से एक यदि आप बाध्य हैं वह संपत्ति)।

तो, आपके मामले में, आप selectedObject को अपने नियंत्रक वर्ग पर selectedSerialPort संपत्ति से बांध सकते हैं। जब उपयोगकर्ता "कनेक्ट" बटन पर क्लिक करता है, तो आपको केवल selectedSerialPort संपत्ति का संदर्भ लेना होगा।

6

आप sample Xcode project here डाउनलोड कर सकते हैं। यह करीब के रूप में चिपक जाता है क्योंकि मैं आपके विवरण में जा सकता हूं।

महत्वपूर्ण बात यह है कि सरणी नियंत्रक, AppController और पॉपअप बॉक्स के बीच कनेक्शन को देखना महत्वपूर्ण बात है।

असल में, यह दिखाता है कि एलेक्स ने क्या कहा।

+0

अबीज़ेम, मुझे आपके कोड के रूप में जवाब देने के लिए स्वीकार करना अच्छा लगेगा, स्पष्टीकरण ने एक इलाज किया था! – Clokey

+0

क्या होगा यदि आप अपने सभी पोर्ट्स सरणी को awakeFromNib तक प्रारंभ नहीं करते हैं? मूल्यों को फिर से लोड करने के लिए आप NSPopUp बटन को कैसे बताएंगे? – johnboiles

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