2011-03-29 13 views
7

सबसे पहले, कुछ पृष्ठभूमि: मैं कोको में ओएस एक्स के लिए एक मास्टर-विस्तार इंटरफेस को लागू करने की कोशिश कर रहा हूं। यही है, मेरे पास एक खिड़की है जिसमें दो NSTableView एस हैं जो दो अलग-अलग प्रकार की वस्तुओं को प्रदर्शित करते हैं। इस सवाल के लिए, मान लीजिए कि वे गोदामों और पैकेज हैं (एक उदाहरण चुनने के लिए जो मेरी वास्तविक समस्या के अनुरूप है।) पहले टेबल व्यू (गोदाम पर) में एक पंक्ति का चयन करना उस गोदाम से संबंधित पैकेजों की एक सूची प्रदर्शित करेगा दूसरी तालिका दृश्य। मॉडल भाग के लिए, मेरे पास वर्तमान में NSMutableArray गोदाम वस्तुओं के गोदामों को बुलाया गया है, और प्रत्येक वेयरहाउस ऑब्जेक्ट में पैकेज ऑब्जेक्ट्स का NSArray है। ध्यान देने योग्य बात यह है कि एनआईबी फाइलों को लोड करने के बाद वेयरहाउस चर संशोधित किया जाता है, इसलिए NSArrayController को अधिसूचित किया जाना चाहिए।अलग एनआईबी फाइलों में एकाधिक विचारों के बीच एक एनएसएआरएआर कंट्रोलर साझा करना

अब, मैंने इसे व्यवस्थित करने का प्रयास किया है ताकि "मास्टर" अपने स्वयं के दृश्य वस्तु में हो, और "विस्तार" अपने स्वयं के दृश्य वस्तु में है। इसका मतलब है कि तीन एनआईबी हैं: एक वेयरहाउस व्यू एनआईबी, वेयरहाउस डेंटल व्यू एनआईबी, और मेनविंडो एनआईबी।

  • WarehousesView निब एक WarehousesViewController (NSViewController से subclassed) और देखने में ही का एक उदाहरण में शामिल है।
  • वेयरहाउस डिन्यू व्यू एनआईबी में वेयरहाउसडिंट व्यू कंट्रोलर और दृश्य स्वयं का एक उदाहरण है।
  • मेनविंडो एनआईबी में मुख्य विंडो, मेनविंडो कंट्रोलर का एक उदाहरण, और वेयरहाउस व्यू और वेयरहाउस डिनव्यू व्यू दोनों का एक उदाहरण शामिल है। विंडो में स्वयं NSSplitView है, और विभाजन दृश्य के दृश्य एनआईबी फ़ाइल में संबंधित दृश्य उदाहरणों से जुड़े हुए हैं।

जो मुझे मेरे सवाल की पहली छमाही के लिए लाता है:

1) इस विभाजित एक कोको आवेदन के लिए आवेदन विचारों का एक अच्छा तरीका है? मेरे लिए यह समझ में आता है, क्योंकि बाद के बिंदु पर गोदाम के बारे में अधिक जानकारी इसके पैकेज सूची की सूची के अलावा वेयरहाउस डेंशन व्यू में जोड़ा जा सकता है।

यह एक महत्वपूर्ण सवाल है, क्योंकि सब कुछ ठीक काम करता है अगर मैं दृश्य बनाने, सीधे विंडो में सभी नियंत्रण लगाने को छोड़ और कुछ NSArrayController गोदामों और संकुल के लिए इसी उदाहरणों, एक ही निब फ़ाइल में सहित सब कुछ डाल दिया, है। मुझे सवाल के दूसरे भाग में पूछने की ज़रूरत नहीं है अगर मुझे इसे इस तरह से नहीं करना चाहिए।

प्रश्न की दूसरी छमाही मूल रूप से है:

2) मैं कहां रखना चाहिए NSArrayController रों गोदामों और संकुल के लिए इसी अगर मैं इसे ऊपर वर्णित ताकि गुरु-विस्तार इंटरफेस अभी भी काम करता है के रूप में विभाजित? वर्तमान में मैं कोको बाइंडिंग मेरी गोदामों सरणी के लिए बाध्य करने के लिए NSArrayController जरूरत है, और NSArrayController गोदाम के चयन करने के लिए बाध्य करने की जरूरत है संकुल की सामग्री सरणी का उपयोग कर रहा है, तो किसी भी तरह गोदाम की सामग्री सरणी NSArrayController

मैंने कुछ चीजों की कोशिश की, और मैं पूरी तरह से काम करने के लिए कुछ भी नहीं मिला। विशेष रूप से, मैंने वेयरहाउस व्यू एनआईबी में गोदामों के लिए NSArrayController और वेयरहाउस डिन्यू व्यू एनआईबी में पैकेज के लिए NSArrayController डालने का प्रयास किया है। इस दृष्टिकोण के साथ समस्या यह है कि वे वेयरहाउस NSArrayController के चयन में पैकेज NSArrayController को बाध्य करने का कोई तरीका नहीं समझ सकते हैं।दूसरी चीज मैंने कोशिश की है (1) मेनविंडो एनआईबी में NSArrayController एस दोनों को डालने, (2) उन NSArrayController एस को मेनविंडो कंट्रोलर में आईबीओटलेट्स से जोड़ने, फिर (3) उन चर को अपने रचनाकारों के माध्यम से अपने संबंधित दृश्य नियंत्रकों को पास करना, (4) उन्हें केवीसी के माध्यम से व्यू कंट्रोलर में गुणों के रूप में उजागर करना, और (5) फ़ाइल के मालिक के माध्यम से सरणी नियंत्रक के दृश्य में आवश्यक तालिका कॉलम को बाध्य करना। परिणाम यह था कि कुछ भी दिखाई नहीं दिया, लेकिन कोई त्रुटि नहीं थी। यदि इनमें से एक दृष्टिकोण यह करने का पसंदीदा तरीका है, तो मैं यह देखने में सहायता के लिए अधिक जानकारी दे सकता हूं कि मैं इसे गलत तरीके से कर रहा हूं या नहीं।

अग्रिम धन्यवाद!

संपादित करें: मैं this related question पर देखने की थी, और वे अगर मैं इसे सही ढंग से समझ में आ प्रत्येक निब फ़ाइल के लिए NSArrayController के अलग उदाहरणों का उपयोग किया लग रहा था, और कहा कि देखने के एक डिजाइन बिंदु से समझ बनाने के लिए नहीं लगता था, लेकिन शायद मैं गलत हूँ?

उत्तर

1

भाग 1: आप निश्चित रूप से ऐसा कर सकते हैं। मैं कहूंगा कि यह वरीयता का मामला है। व्यक्तिगत रूप से, यदि दृश्य एक खिड़की में एक साथ प्रदर्शित किए जा रहे थे, तो मैं उन्हें एक ही निब में रखूंगा। * मॉड्यूलरिटी भी एक अच्छी बात है।

भाग 2: जहां भी आप चाहें सरणी नियंत्रक डाल सकते हैं, वास्तव में। केवल एक चीज जिसकी आपको चिंता करने की ज़रूरत है, वह प्रत्येक ऑब्जेक्ट को उन संदर्भों को प्राप्त कर रहा है जिनके लिए आपको वह जानकारी चाहिए जो आपको चाहिए। यदि आप मेरी 2 ¢ चाहते हैं, तो मैं कहूंगा कि प्रत्येक को निब में रखा गया है, इसकी सामग्री को प्रदर्शित किया जाएगा। इससे आपका विवरण दृश्य सेटअप अधिक कठिन हो जाएगा, लेकिन यह उस मॉड्यूलरिटी को जारी रखेगा जो आपको लगता है।

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

ऐसा लगता है कि आप WarehouseView और WarehouseDetailView के उदाहरणों को अपने व्यक्तिगत निब्स और MainMenu.nib दोनों में डालते हैं और उम्मीद करते हैं कि वे वही ऑब्जेक्ट्स हों। ऐसा नहीं होगा। आपको ऑब्जेक्ट्स में ऑब्जेक्ट्स को उन ऑब्जेक्ट्स से लिंक करना होगा जिन्हें वे पहले ही जानते हैं। आपको अपनी विशेष स्थिति के लिए इसे बाहर करना होगा।

मुझे नहीं पता कि आपका मॉडल कहां संग्रहीत है, या आप कैसे निब लोड हो रहे हैं। जो भी ऑब्जेक्ट लोडिंग कर रहा है, वैसे भी, व्यक्तिगत निब और बाकी ऐप के बीच आपका लिंक होगा। निब्स में फ़ाइल का स्वामी प्रॉक्सी ऑब्जेक्ट यह है कि यह आपको एनआईबी में ऑब्जेक्ट को हुक करने के लिए एक जगह देता है जिसे वे अन्यथा नहीं जानते हैं।


*: आप इसे आसान विचारों लेआउट करने के लिए मिल जाए, तो वे आईबी में विभाजित दृश्य में संलग्न नहीं कर रहे हैं, तो आप उन्हें अपने दम पर सेट अप कर सकते हैं: MainMenu.xib विंडो में कस्टम दृश्य वस्तुओं डाल और आप प्रत्येक दृश्य को अपनी आईबी विंडो में खोल सकते हैं (हालांकि यह ऐप में विंडो में नहीं होगा)। फिर विभाजित दृश्य के सबव्यूज़ को awakeFromNib में सेट करें।

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