2011-07-06 10 views
5

मैं एक आईओएस स्थिर पुस्तकालय डिजाइन कर रहा हूं जिसका उपयोग अन्य डेवलपर्स द्वारा किया जाएगा। इस पुस्तकालय को अपना खुद का मोडल यूआई प्रदान करने की जरूरत है। मैं इसे पूरा करने के लिए एप्लिकेशन और इस लाइब्रेरी के बीच इंटरफ़ेस को डिज़ाइन करने का सबसे आसान तरीका ढूंढ रहा हूं। मुझे केवल आईओएस 4.0 और उससे ऊपर का समर्थन करने की आवश्यकता है।आईओएस स्थैतिक पुस्तकालय को डिजाइन करने का सबसे आसान तरीका क्या है जो अपना मोडल यूआई प्रदान करता है?

असहज वास्तुकला

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

मैं इसे पूरा करने के दो तरीके देख सकता हूं।

विकल्प 1

जब आवेदन अपने यूआई दिखाने के लिए पुस्तकालय चाहता है, AppDelegate self.window में गुजरता है, और पुस्तकालय का अपना रूट दृश्य नियंत्रक सेट, प्रभावी रूप से यूआई के पूर्ण स्वामित्व लेने। जब यूआई समाप्त हो जाता है, तो यह ऐपडिलेगेट को सूचित करता है, जो तब यूआई के स्वामित्व को वापस लेते हुए विंडो पर अपना रूट व्यू कंट्रोलर सेट करता है।

विकल्प 2

पुस्तकालय के लिए एक दृश्य नियंत्रक, जो एप्लिकेशन पर जो कुछ भी देखने ढेर यह पसंद करती धक्का कर सकते हैं उजागर करता है। ऐप दृश्य नियंत्रक को हटाने के लिए भी ज़िम्मेदार है जब पुस्तकालय यह सूचित करता है कि यूआई समाप्त हो गया है।

मुद्दे

विकल्प 1 के साथ, वहाँ जड़ दृश्य नियंत्रकों को बदलने के लिए एक आवेदन चल रहा है के बीच में है, जबकि समस्याओं हो सकता है। विकल्प 2 के साथ, दृश्य नियंत्रक प्रदान करने में समस्याएं हो सकती हैं जो मनमाने ढंग से संदर्भ में काम कर सकती हैं (पूर्ण विंडो दृश्य नियंत्रक के रूप में, एक UINavigationController के उप-दृश्य के रूप में)।

दोनों विकल्पों के साथ एक और समस्या अन्य यूआईएप्लिकेशंस डिलीगेट अधिसूचनाएं हैं जो ऐपडिलेगेट प्राप्त कर सकती हैं, जैसे एप्लिकेशनविल्लरसिग्निएक्टिव: और एप्लिकेशनडिडबैक्टएक्टिव:। लाइब्रेरी को इसकी यूआई को सही तरीके से बनाए रखने के लिए नोटिफिकेशन को संभालने की आवश्यकता हो सकती है। क्या ऐप डिलीगेट लाइब्रेरी में इनमें से प्रत्येक को निष्क्रिय करेगा जब उसका यूआई सक्रिय हो?

क्या कोई बेहतर विकल्प 3 है जिसके बारे में मैंने सोचा नहीं है?

उत्तर

3

यहाँ कैसे मैं यह कर दिया गया है: अपने स्थिर पुस्तकालय में अपने UIViewController और सभी सामग्री को देखता है आप प्रोग्राम की जरूरत बनाने (के बाद से आप आसानी से iOS पर व्यवस्थाएं नहीं कर सकते हैं तो आप आसानी से बंडल नहीं संसाधनों):

UIViewController *controller = [[[UIViewController alloc] initWithNibName: nil bundle: nil] autorelease]; 
UIView *containerView = [[[UIView alloc] initWithFrame: [UIScreen mainScreen].applicationFrame] autorelease]; 
containerView.backgroundColor = [UIColor darkGrayColor]; 

UIWebView *webView = [[[UIWebView alloc] initWithFrame: containerView.bounds] autorelease]; 
webView.delegate = self; 

// ... some other code to setup custom things 

[containerView addSubview: webView]; 

// ... some other code to setup custom things, spinner etc. 

तो साथ

[[UIApplication sharedApplication].keyWindow.rootViewController presentModalViewController: myViewController animated: YES]; 

यह कटौती करने और एक काम स्थिर पुस्तकालय है कि दो अलग अलग आईओएस अनुप्रयोगों में एम्बेड किया गया है और दोनों में अच्छी तरह से काम करने लगता है से चिपकाया जाता है यह प्रदर्शित करते हैं। ऐसे किनारे के मामले हो सकते हैं जिनमें यह शामिल नहीं है, लेकिन मैंने उन्हें अभी तक नहीं मारा है :)

+0

क्या हमें एनएसओब्जेक्ट क्लास –

+0

में यह कोड लिखने की ज़रूरत है, आप इसे जितनी भी कक्षा में डाल देंगे, वह NSObject से निकली है और इसे ObjectiveC कोड होना चाहिए, इसलिए मुझे यकीन नहीं है कि मैं आपका प्रश्न समझता हूं। ध्यान दें कि यह> 2 साल पुराना है इसलिए सुनिश्चित नहीं है कि यह अभी भी वैध है या नहीं। – Dad

+0

उत्तर के लिए टीएनएक्स आपका कोड अच्छा काम कर रहा है। यह मेरे कोड में एक गलती थी। भयानक कोड यह मेरे समय को बहुत बचाता है .. –

1

एक प्रतिनिधि के बजाय ब्लॉक का उपयोग करें। आपके विचार को एक प्रॉपर्टी में संग्रहीत dismissBlock पर कॉल करना चाहिए, और कॉलर ऐसा कर सकता है जो उसे उस ब्लॉक से करने की ज़रूरत है। क्या आपके पास वापस जाने के लिए आवश्यक डेटा है? इसे ब्लॉक का तर्क दें या उचित रूप से अपने व्यू कंट्रोलर से सुलभ ऑब्जेक्ट की एक संपत्ति में रखें।

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

सटीक रूप से यूआई को क्लाइंट एप्लिकेशन पर कैसे प्रदर्शित किया जाना चाहिए, लेकिन यह प्रदान करके कि यूआई को वास्तव में मॉड्यूल प्रदर्शित किया जाना चाहिए, आप अपने पर्यावरण को सीमित कर सकते हैं कि आपको मेजबान पर्यावरण के बारे में ज्यादा चिंता न करें ।

5

आप एक UIViewController स्वीकार करने के लिए अपने एपीआई को डिजाइन करने पर विचार किया है:

- (void)presentFromViewController:(UIViewController *)presentingViewController 
         animated:(BOOL)animated 
{ 
    [presentingViewController presentModalViewController:myViewController 
               animated:animated]; 
} 

इस तरह, अपने पुस्तकालय कैसे मोडल यूआई प्रस्तुत किया है पूरा नियंत्रण होता है, और यह भी नहीं बल्कि प्रतिनिधि पर भरोसा करने की बजाय -dismissViewControllerAnimated: ही कॉल कर सकते हैं ऐसा करने के लिए।

-applicationWillResignActive: आदि पास करने के लिए परेशान न करें। बस अपनी लाइब्रेरी कक्षा में अंतर्निहित अधिसूचनाओं UIApplicationWillResignActiveNotification आदि के लिए पंजीकरण करें।

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

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