2014-11-05 7 views
8

मेरे पास मैक दस्तावेज़-आधारित कोर डेटा एप्लिकेशन है जो स्टोरीबोर्ड का उपयोग करता है। स्टोरीबोर्ड में निम्नलिखित लेआउट है:एकाधिक स्टोरीबोर्ड दृश्यों में एक एनएसएआरएआर कंट्रोलर का उपयोग

Window Controller 
    Split View Controller 
     Table View Controller 
     Text View Controller 

मेरा कोर डेटा मॉडल में एक अध्याय इकाई है जिसमें दो विशेषताएं हैं: शीर्षक और सामग्री। मैं टेबल अध्याय प्रत्येक अध्याय शीर्षक दिखाने के लिए चाहता हूँ। टेक्स्ट व्यू चयनित अध्याय की सामग्री दिखाता है।

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

लेकिन स्टोरीबोर्ड के साथ चीजें अधिक जटिल हो जाती हैं। मैं तालिका दृश्य नियंत्रक में एक सरणी नियंत्रक जोड़ सकता हूं, तालिका दृश्य को सरणी नियंत्रक को बांध सकता हूं, और तालिका दृश्य में अध्याय शीर्षक दिखा सकता हूं। लेकिन टेक्स्ट व्यू कंट्रोलर उस सरणी नियंत्रक से बांध नहीं सकता है क्योंकि सरणी नियंत्रक दूसरे दृश्य में है।

मैं इंटरफ़ेस बिल्डर में एक सरणी नियंत्रक कैसे जोड़ूं ताकि तालिका दृश्य नियंत्रक और टेक्स्ट व्यू नियंत्रक दोनों इसे एक्सेस कर सकें और उससे जुड़ सकें?

+0

बस एक संपत्ति के रूप में अनुप्रयोग प्रतिनिधि में यह छड़ी ... (मजाक कर रहा है, ज्यादातर।) लेकिन क्या keypaths माता पिता विचारों के लिए मौजूद हैं ओएसएक्स स्टोरीबोर्ड में? – stevesliva

+1

NSViewController में parentViewController प्रॉपर्टी है। लेकिन अगर मैं स्प्लिट व्यू कंट्रोलर में एरे कंट्रोलर जोड़ता हूं और टेबल व्यू कॉलम के वैल्यू बाइंडिंग को बाइबल व्यू कंट्रोलर को पैरेंट व्यू कंट्रोलर.एरेरे कंट्रोलर.आरंगेड ऑब्जेक्ट्स के मॉडल कुंजी पथ का उपयोग करके बाध्य करता है, तो ऐप क्रैश करता है कि कक्षा केवीसी-अनुरूप नहीं है कुंजी सरणी नियंत्रक। मैंने सरणी नियंत्रक के लिए मेरे विभाजित दृश्य नियंत्रक उपclass में एक आउटलेट जोड़ा और आईबी में बनाए गए सरणी नियंत्रक को आउटलेट कनेक्ट किया, और एक ही क्रैश होता है। –

+0

मैं इसे फिर से पढ़ रहा था ... शायद आपके subController प्रॉपर्टी वाले विशिष्ट सबक्लास को वापस करने के लिए parentViewController गेटर को ओवरराइड करें? हालांकि, बदसूरत है। – stevesliva

उत्तर

14

यह काम करने के लिए कुंजी अपने NSViewController उपवर्गों उतरते और उन्हें एक साथ बाध्यकारी एक केंद्रीय डेटा स्रोत (सबसे अधिक संभावना आपके NSDocument उपवर्ग) के माध्यम से में से प्रत्येक में एक NSArrayController उदाहरण है। इसके बाद आप इस डेटा स्रोत को अपने NSViewController सबक्लास representedObject के रूप में अपने अवरोही नियंत्रकों के माध्यम से नीचे भेजकर सेट कर सकते हैं।

class Document: NSDocument { 

    var dataSource: DataSource? = DataSource() 

    ... 
} 

class DataSource: NSObject, NSCoding { 

    var items: [Item] = [] 
    var selectionIndexes: NSIndexSet = NSIndexSet() 

    ... 
} 

class WindowController: NSWindowController { 

    override var document: AnyObject? { 
     didSet { 
      if let document = self.document as? Document { 
       self.contentViewController?.representedObject = document 
      } 
     } 
    } 

} 

class SplitViewController: NSSplitViewController { 

    override var representedObject: AnyObject? { 
     didSet { 
      for viewController in self.childViewControllers as! [NSViewController] { 
       viewController.representedObject = representedObject 
      } 
     } 
    } 
} 

चाल से प्रत्येक के लिए representedObject बाध्य करने के लिए है: यहाँ एक NSWindowController जो कि दो बच्चे दृश्य नियंत्रक (एक मास्टर/विस्तार से सेटअप) के साथ एक NSSplitViewController है कि किसी सामग्री को देखने नियंत्रक के साथ एक स्टोरीबोर्ड आवेदन का एक उदाहरण है स्टोरीबोर्ड में आपके अवरोही दृश्य नियंत्रक के NSArrayController का। आपको केवल contentArray को बाध्य करने की आवश्यकता नहीं है, लेकिन selectionIndexes भी।

नतीजा यह है कि दोनों उतरते NSArrayController रों पर selectionIndexes सिंक में रखा जाता है, क्योंकि वे केंद्रीय डेटा स्रोत (उपरोक्त उदाहरण में DataSource उपवर्ग) के माध्यम से बंधे हुए हैं है।

यह सब स्पष्ट बनाने के लिए मैं एक उदाहरण परियोजना दर्शाता है कि यहां इस बनाया है: https://github.com/acwright/StoryboardBindingsExample

+0

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

+0

धन्यवाद! मैं जिस परियोजना को शुरू कर रहा था उसके लिए बाइंडिंग छोड़ने वाला था, लेकिन मुझे लगा कि एक समाधान संभव होना चाहिए! तब यह मेरे लिए हुआ कि यह वास्तव में चयन को सिंक में रखने का मामला था! :) –

+0

क्या आपको कोर डेटा के लिए काम करने के लिए यह मिला है? मैंने आपके द्वारा किए गए कार्यों के बारे में एक समान विचार किया था, लेकिन जब मैं चयन सूचकांक प्राप्त कर सकता हूं और साबित करता हूं कि इसे एक दृश्य से अपडेट किया जा रहा है, तो मैं हमेशा दूसरे दृश्य में एक खाली सरणी नियंत्रक के साथ समाप्त होता हूं। – LighteningKid

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