मैं एक मैकोज़ ऐप पर काम कर रहा हूं जो तालिका दृश्य में ग्राहक मास्टर रिकॉर्ड्स की एक सूची प्रस्तुत करता है। तालिका दृश्य में एक पंक्ति पर डबल-क्लिक करने से एक नई विंडो खुलनी चाहिए जहां उपयोगकर्ता ग्राहक की जानकारी देख और संपादित कर सकता है।

यह एक स्टोरीबोर्ड और स्विफ्ट का उपयोग करते हुए एक Xcode 8.3.3 प्रोजेक्ट है।
यह कोई दस्तावेज़ या कोर डेटा ऐप नहीं है।

मेरे पास मुख्य विंडो उस बिंदु तक काम कर रही है जहां तालिका दृश्य रिकॉर्ड्स को सही ढंग से प्रदर्शित कर रहा है और संबंधित दृश्य नियंत्रक डबल-क्लिक ईवेंट प्राप्त कर रहा है और उन्हें कंसोल पर लॉगिंग कर रहा है।

मैंने संपादन विंडो के लिए एक अतिरिक्त विंडो नियंत्रक और दृश्य बनाया है और इसे प्रारंभिक नियंत्रक के रूप में अस्थायी रूप से चिह्नित करके इसकी मूल कार्यक्षमता को सत्यापित किया है।

जो मैं समझ नहीं पा रहा हूं वह यह है कि जब उपयोगकर्ता किसी पंक्ति पर डबल-क्लिक करता है तो उस विंडो का एक नया उदाहरण कैसे प्रदर्शित किया जाए।

@Joshua Nozzi के लिए धन्यवाद मैं करीब हूँ। यहाँ इस बिंदु पर कोड है।

let storyboard = NSStoryboard(name: "Main", bundle: nil)
if let windowController = storyboard.instantiateController(withIdentifier: "xyzzy") as? NSWindowController
{
  windowController.showWindow(self)
}

यह उत्पन्न कर रहा है a

(स्टोरीबोर्ड: 0x620000000680) में पहचानकर्ता 'xyzzy' वाला नियंत्रक नहीं है

त्रुटि।

14
David Patterson 15 जुलाई 2017, 18:25

3 जवाब

सबसे बढ़िया उत्तर

विंडो प्रोग्रामिंग गाइड एक बेहतरीन जगह है। समझें कि विंडोज़ को सामान्य रूप से कैसे प्रबंधित किया जाता है।

विशेष रूप से (यह मानते हुए कि आप स्टोरीबोर्ड में विंडो नियंत्रक दृश्य प्रस्तुत करना जानते हैं), आपको नए विंडो नियंत्रकों के संदर्भों को संग्रहीत करने के लिए कहीं और चाहिए ताकि प्रस्तुत किए जाने पर उन्हें तुरंत हटा दिया (और गायब) न किया जा सके।

आपके मामले में, आप मास्टर विंडो नियंत्रक में अपनी खुली विवरण विंडो की एक सरणी रखना चाह सकते हैं, ताकि यदि मास्टर चला जाए, तो विवरण भी करें। जब एक विवरण विंडो खुली होती है (एक नियंत्रक इंस्टेंस बनाया जाता है और इसकी विंडो दिखाई जाती है), तो आप इसके नियंत्रक को सरणी में संग्रहीत करेंगे; बंद होने पर, आप इसके नियंत्रक को सरणी से हटा देते हैं ताकि इसे हटा दिया जाए।

ऐसा करने के कई तरीके हैं, इस पर निर्भर करते हुए कि आप कितना नियंत्रण चाहते हैं, आप चाइल्ड विंडो के स्वामित्व को कैसे काम करना चाहते हैं, आदि, लेकिन यह मूल पैटर्न आमतौर पर पर्याप्त होता है।

स्टोरीबोर्ड से एक नई विंडो नियंत्रक दृश्य को तुरंत चालू करने के लिए:

var myWindowController = NSStoryboard(name: "MyStoryboardFileName", bundle: nil)?.instantiateControllerWithIdentifier("MyWindowControllerIdentifier") as MyWindowControllerClass
myWindowController?.showWindow(self)
20
Joshua Nozzi 15 जुलाई 2017, 19:32
मैंने विंडो प्रोग्रामिंग गाइड को कवर-टू-कवर नहीं पढ़ा है, लेकिन मैंने आज सुबह इसमें लगभग एक घंटा बिताया और मुझे इस बात का उदाहरण नहीं मिला कि वास्तव में नए कंट्रोलर को कैसे इंस्टेंट किया जाए और विंडो और व्यू को प्रदर्शित किया जाए। जब मैं अपना प्रोजेक्ट बनाता हूं तो जो भी एक्सकोड बनाया जाता है, वर्तमान विंडो स्वचालित रूप से प्रदर्शित हो रही है। इसके अलावा, मैं स्विफ्ट और कोको के लिए नया हूं, लेकिन सामान्य रूप से एक बहुत ही अनुभवी डेवलपर हूं।
 – 
David Patterson
15 जुलाई 2017, 19:28
आह। उस स्थिति में, मेरे उत्तर के अतिरिक्त देखें। :-)
 – 
Joshua Nozzi
15 जुलाई 2017, 19:33
ठंडा। मैं घंटों पहले सही रास्ते पर था। अब प्रश्न यह है कि विंडो नियंत्रक पहचानकर्ता कहाँ से आता है?
 – 
David Patterson
15 जुलाई 2017, 19:41
1
क्या आप वाकई विंडो नियंत्रक के लिए स्टोरीबोर्ड पहचानकर्ता सेट करते हैं, न कि विंडो? यह वास्तव में तीसरा टैब है और जब नियंत्रक का चयन किया जाता है, तो यह पहचान के अंतर्गत होता है, जिसे "स्टोरीबोर्ड आईडी" कहा जाता है। यह केस-संवेदी है, बिल्कुल।
 – 
Joshua Nozzi
15 जुलाई 2017, 20:05
1
वह यह था। स्टोरीबोर्ड में विंडो कंट्रोलर विंडो पर क्लिक करने से कंट्रोलर के अंदर विंडो का चयन होता है। इसके बजाय आपको विंडो कंट्रोलर "टाइटल बार" (जहां कंट्रोलर और फर्स्ट रिस्पॉन्डर आइकन रहते हैं) पर क्लिक करना होगा। सहायता के लिए बहुत-बहुत धन्यवाद।
 – 
David Patterson
15 जुलाई 2017, 20:11

साथ ही, नई विंडो खोलने के लिए, यह कोड आपकी मदद कर सकता है

windowController.contentViewController = tabViewController

पूरा कोड इस तरह है कि मैंने इसे अपने प्रोजेक्ट में इस्तेमाल किया:

@objc func openApplicationView(_ sender: Any?) {
    let mainStoryBoard = NSStoryboard(name: "Main", bundle: nil)
    let tabViewController = mainStoryBoard.instantiateController(withIdentifier: "tabView") as? TabViewController
    let windowController = mainStoryBoard.instantiateController(withIdentifier: "secondWindow") as! TabViewWindowController
    windowController.showWindow(self)
    windowController.contentViewController = tabViewController
}

यदि आपने मेनविंडो को बंद कर दिया है तो यह सहायक हो सकता है। इसलिए आपको अपने अंतर्निहित स्टोरीबोर्ड में एक विंडो नियंत्रक और tabViewController (आप सामान्य दृश्य नियंत्रक का उपयोग कर सकते हैं) जोड़ने की आवश्यकता है।

मेरे पक्ष में tabViewController को NSTAbViewController द्वारा विस्तारित किया गया है और टैब दृश्य घटक को इस वर्ग के साथ जोड़ा गया है।

नोट: मैंने अपने Main.storyboard में विंडोकंट्रोलर को एक घटक के रूप में जोड़ा है और फिर कोडिंग पक्ष पर उपयोग करने के लिए पहचाना गया है।

1
Semih Okan Pehlivan 26 मई 2020, 21:47

की पुष्टि की। यूआई में यह इतना बड़ा गोचा है। और यह बूट करने के लिए छोटी गाड़ी है: स्टोरीबोर्ड में 'मेनविंडो' पहचानकर्ता वाला नियंत्रक नहीं है इस समस्या के समाधान में पूरा दिन बर्बाद हो गया।

-1
rgos 10 फरवरी 2020, 20:59
1
एक लिंक के बजाय, कृपया यहां उत्तर को पुन: पेश करें।
 – 
Death Waltz
10 फरवरी 2020, 21:20