2012-11-17 29 views
13

के बजाय आईपैड पर सामान्य रूप से प्रस्तुत किया जा रहा है IOS 6 में ग्राहक UIActivity subclass का उपयोग करते समय, एक कस्टम व्यू कंट्रोलर निर्दिष्ट करना संभव है जो प्रारंभिक UIActionViewController के दृश्य से आपकी कार्रवाई को चुना जाता है। आप अपने यूआईएक्टिविटी सबक्लास की activityViewController विधि से कस्टम व्यू कंट्रोलर के संदर्भ को वापस कर कर ऐसा करते हैं।UIActivity गतिविधि ViewController को पॉपओवर

UIActivity class reference के अनुसार:

activityViewController

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

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

ध्यान दें कि पहले पैराग्राफ के अंत में थोड़ा: iPad पर, आपके विचार नियंत्रक एक पॉपओवर के अंदर प्रस्तुत किया है। आईफोन और आईपॉड टच पर, आपका व्यू कंट्रोलर सामान्य रूप से प्रस्तुत किया जाता है।

हालांकि, आईपैड पर देखने activityViewController द्वारा दिया नियंत्रक हमेशा रुप से प्रदर्शित करता है, चाहे कितना मैं UIActivityViewController (या तो रीति से या एक पॉपओवर के माध्यम से) प्रस्तुत करते हैं। एक पॉपओवर के माध्यम से पेश करते समय, यह क्रैश होने का कारण बनता है क्योंकि ऐसा नहीं लगता कि इसे खारिज कर दिया गया है।

मैं क्या गलत कर रहा हूं? क्या यह आईओएस 6 में एक बग है?


अद्यतन: यहाँ एक सरल Xcode प्रोजेक्ट है कि समस्या को दिखाता है। यह क्लोन करने के लिए स्वतंत्र महसूस और देखने के लिए आप देख सकते हैं, जहां हम गलत जा रहे हैं चारों ओर खेलने: github.com/simonwhitaker/GSActivityDemo

+0

अपने प्रश्न क्या है? – msgambel

+0

यहां वही समस्या है। मैंने एक स्पष्ट प्रश्न जोड़ने के लिए मूल पोस्ट में संशोधन किया है, आशा है कि आपको @ गुजमिन नहीं लगेगा। –

+0

बहुत व्यापक, अनपेक्षित करने के लिए .... :(मैं जंगली अनुमान शुरू कर सकता हूं लेकिन मैं आपको प्रश्न संपादित कर सकता हूं और शायद कुछ कोड या ऐसा दिखा सकता हूं! - ओह और क्या आप आर्क का उपयोग कर रहे हैं? –

उत्तर

23

हम UIActivityViewController, उपयोगकर्ता के लिए उपलब्ध गतिविधियों दृश्य दिखाए जा रहे है जिसके बारे में बात कर रहे हैं के रूप में। ऐप्पल निम्नलिखित राज्य ...

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

मैंने आखिरी पंक्ति को एक संकेत के रूप में लिया है जिसे आपको दृश्य को प्रस्तुत करने के तरीके को संभालना है, इसलिए मैं जांचता हूं कि कोड आईपैड पर चल रहा है या नहीं, इसके अनुसार यूआईपीओवर का उपयोग करें। जैसा कि आप निम्न विधि के भीतर यहां देख सकते हैं ... https://github.com/bufferapp/buffer-uiactivity/blob/master/BufferUIActivity/Views/FirstViewController.m

-(IBAction)openUIActivityView:(id)sender { 

    NSString *text = @"Hello world"; 
    NSString *url = @"http://bufferapp.com"; 


    NSArray *activityItems = @[text, url]; 

    BufferUIActivity *bufferActivity = [[BufferUIActivity alloc] init]; 

    UIActivityViewController *activityView = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:@[ bufferActivity ]]; 


    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { 
     [self presentViewController:activityView animated:YES completion:^{ 

     }]; 
    } else { 
     // Change Rect to position Popover 
     self.popup = [[UIPopoverController alloc] initWithContentViewController:activityView]; 
     [self.popup presentPopoverFromRect:CGRectMake(self.view.frame.size.width/2, self.view.frame.size.width/2, 100, 100) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 
    } 

} 
+0

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

+0

माफ़ी, यह एक अजीब बात है क्योंकि मैंने बफर के लिए किए गए यूआईएक्टिविटी को भी आईपैड पर मॉड्यूल प्रदर्शित किया है, हालांकि ऐप्पल के ट्विटर/फेसबुक शीट्स भी हैं। मुझे लगता है कि यह आईओएस 6 के साथ एक मुद्दा है या दस्तावेज गलत है। – AndyDev

3

मुझे लगता है कि एक पॉपओवर में दिखाई देने वाले गतिविधि दृश्य नियंत्रक के साथ समस्या एक बग है और दस्तावेज़ सही इरादे को प्रतिबिंबित करते हैं। हालांकि, मुझे इस एटीएम को काम करने के तरीके के बारे में पता नहीं है।

हालांकि, दृश्य नियंत्रक को खारिज करने का हिस्सा एक अलग मुद्दा है। आपको -[UIActivity activityViewController] से वापस आने वाले व्यू कंट्रोलर को खारिज नहीं करना चाहिए, लेकिन आप आपके द्वारा पेश किए गए पॉपओवर को खारिज करने के लिए ज़िम्मेदार हैं, जो बदले में पदानुक्रम से आपके कस्टम व्यू कंट्रोलर को भी हटा देगा। (और क्योंकि यह इस तरह से काम करता है, मुझे विश्वास है कि कस्टम दृश्य नियंत्रक सामान्य रूप से पॉपओवर में दिखाया करना होगा इच्छुक हूँ।)

यहाँ your example app से कोड के साथ एक उदाहरण है:

UIActivityViewController *vc = [[UIActivityViewController alloc] initWithActivityItems:activityItems 
                   applicationActivities:applicationActivities]; 

vc.completionHandler = ^(NSString *activityType, BOOL completed){ 
    [self.activityPopoverController dismissPopoverAnimated:YES]; 
}; 
+0

दूसरे विचार पर, एंडीडेव का उल्लेख है, प्रिंट संवाद को छोड़कर, अन्य सभी अंतर्निर्मित गतिविधियां एक मोडल स्क्रीन के साथ भी दिखाई देती हैं। एक और सुराग यह है कि कस्टम व्यू कंट्रोलर पेश करने से पहले, यह '- [UIViewController setModalTransitionStyle:] 'संदेश प्राप्त करता है, यह सुझाव देता है कि यह वास्तव में जानबूझकर इसे सामान्य रूप से प्रस्तुत करना चाहता है। – alloy

+0

दृश्य नियंत्रक के साथ इस मुद्दे पर अच्छी पकड़ को खारिज नहीं करना। धन्यवाद! –

+0

मुझे लगता है कि ऐप्पल ने एक निजी एपीआई कॉल हो सकता है जिसे ऐप्पल ने बेनकाब करने के लिए उपेक्षित किया है, जो नियंत्रित करता है कि गतिविधि को देखने के लिए सामान्य रूप से या मौजूदा पॉपओवर में ViewController प्रस्तुत करना है या नहीं। –

-3

मैं तो बस एक ही समस्या थी, लेकिन करने के लिए ViewController निर्धारित करके इसे हल:

में
[yourViewController setModalPresentationStyle:UIModalPresentationPageSheet]; 

- (UIViewController *)activityViewController 

इस मदद करता है

+1

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

1


मैं समाधान को दिखाने के लिए पॉपओवर में कस्टम दृश्य बना सकते हैं और -(UIViewController *)activityViewController में यह लौटने के बजाय -(void)performActivity विधि में यह दिखाने के लिए है आईओएस 7 में एक ही समस्या थी उम्मीद है।

आप इस लिंक के तहत मेरे प्रश्न/उत्तर में उदाहरण कोड देख सकते हैं:
iOS 7 custom UIActivity as popover

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

  • कोई संबंधित समस्या नहीं^_^