UIActionSheet रद्द करें बटन अजीब व्यवहार


116

मेरे पास एक UIBarButtonItem है जो उपयोगकर्ताओं को क्या करना है इसके बारे में विकल्प प्रदान करने के लिए एक एक्शन शीट खोल रहा है। जब तक मैं "रद्द करें" बटन पर क्लिक करने की कोशिश नहीं करता, तब तक सब कुछ अपेक्षित है। बटन का लक्ष्य प्रतीत होता है कि यह कहाँ से ऊपर जाना चाहिए। मैं केवल "रद्द करें" और "ओके" बटन के बीच में कहीं क्लिक करके इसे सक्रिय कर सकता हूं।

मैंने अन्य अनुप्रयोगों में एक्शन शीट पर कोशिश की है और वे ठीक काम करते हैं, इसलिए यह सिर्फ मेरा बड़ा अंगूठा नहीं है। UIViewController में एक्शन शीट खुल रही है

- (void)showOpenOptions
{
    UIActionSheet *sheet = [[UIActionSheet alloc] 
    initWithTitle:NSLocalizedString(@"Open link in external application?", @"Open in external application")
    delegate:self
    cancelButtonTitle:NSLocalizedString(@"Cancel", @"Cancel")
    destructiveButtonTitle:NSLocalizedString(@"Open Link", @"Open Link")
    otherButtonTitles:nil];

    [sheet showInView:self.view];
    [sheet release];
}

5
एक असंबंधित नोट पर, मुझे Apple UI समीक्षा सत्र के दौरान WWDC में बताया गया था कि एक्शन शीट्स पर लाल बटन वास्तव में 'विनाशकारी' क्रियाओं के लिए अभिप्रेत है (अर्थात 'डिलीट')।
रामिन

हाँ, मैंने हाल ही में मानव इंटरफ़ेस दिशानिर्देशों को पढ़ा और देखा। इसे लाल से ग्रे में बदल दिया।
नवन राजा

जवाबों:


190

एक्शन शीट में करंट व्यू कंट्रोलर के दृश्य को पास करने के बजाय, की showFromTabBar:विधि का उपयोग करें UIActionSheet

सही तरीका
यह सही टेप करने योग्य क्षेत्र देगा:

[actionSheet showFromTabBar:self.tabBarController.tabBar];

गलत तरीका
यह टेप करने योग्य क्षेत्र को गलत स्थान पर डाल देगा (यदि आप टैब बार या टूलबार का उपयोग कर रहे हैं):

[actionSheet showInView:self.view];

यदि आप एक टूलबार का उपयोग कर रहे हैं , तो showFromToolbar:इसके बजाय विधि का उपयोग करें । आपको टूलबार के संदर्भ की आवश्यकता होगी, सबसे अधिक संभावना एक आइवर

[actionSheet showFromToolbar:self.myToolbar];

मेरा पुराना उत्तर भी काम करता है, लेकिन हैकी है:

बस एक संभावित उत्तर मिला:

01-Dec-2008 10:22 अपराह्न टॉम सैक्सटन: मैंने इस बग को कुछ और देखा, और यह टैबबार के साथ एक मुद्दा लगता है।

यदि आप UIActionSheet के [शीट showInView: self.view] को कॉल करते हैं, तो एक व्यू कंट्रोलर से जो कि UITabViewController का बच्चा है, तो रद्द बटन पर हिट परीक्षण UIActionSheet के उस हिस्से में विफल रहता है जो टैबबार के दृश्य से ऊपर है।

यदि आप इसके बजाय UITabBarController के दृष्टिकोण से गुजरते हैं, तो UIActionSheet अपेक्षा के अनुसार कार्य करता है।

ध्यान दें: iPhone OS 2.1 और पहले में, UIActionSheet टैब बार के ऊपर से आया था जब आप बच्चे के दृश्य को पास करते हैं, लेकिन 2.2 में, यह टैब बार के नीचे से आता है, और इस प्रकार टैब दृश्य को कवर करता है।

http://openradar.appspot.com/6410780

संपादित करें: यह तब सही ढंग से काम करता है जब मैं टैब बार के दृश्य को देखने के लिए बदलता हूं

[sheet showInView:self.parentViewController.tabBarController.view];

इस पर काम किया क्योंकि यह काम करता है। यह अन्य उत्तरों से बेहतर क्यों है?
बेंटफोर्ड

1
पेरेंटव्यूकंट्रोलर क्यों? यहां तक ​​कि अगर दृश्य एक नेविगेशन दृश्य टैब में हो तो भी BarCController अभी भी सही जगह पर इंगित करना चाहिए। किसी भी मामले में parentViewController के बिना मेरे लिए काम करता है।
नाथन

11
एक और उत्तर संभावित रूप से बेहतर लगता है। [ActionSheet showInView: [self.view window]] देखें। अधिक सीधे और अधिक सामान्य लगता है।
केविन

इस उत्तर को पोस्ट करने के लिए बहुत बहुत धन्यवाद।
फुलवियो

1
मेरे पास मेरे ऐप में टैब बार नहीं है, लेकिन फिर भी ऐसी समस्या है। मैंने इसे '[serf.view window]' के साथ हल किया। यह वैसे भी टैब बार की समस्या नहीं है।
माइक केस्किनोव

37

मुझे यहाँ पर एक उत्तर मिला जो काम करता है।

का उपयोग कर [filterActionSheet showInView:[self.view window]]:;

मैंने अपने टैब बार पर आने के लिए कुछ तरीके आज़माए और उन्होंने इस ऐप को सेट किया है, ऐसा लगता है कि यह जटिल है ...


उत्तम! धन्यवाद। यह मेरे लिए सही समाधान है, क्योंकि मैं एक UITableViewController के साथ इस मुद्दे पर चल रहा था जिसमें यहां अन्य लोगों की तरह एक टूलबार नहीं था ।
विलियम डेनिस

अच्छा सामान, यह मेरे लिए काम किया! यह निश्चित रूप से इसे करने का सबसे आसान तरीका है!
cgossain

2
यह एक और समस्या का कारण बनता है। परिदृश्य में डिवाइस (साथ ही अन्य सभी सामग्री) में एक्शनशीट पोर्ट्रेट ओरिएंटेशन में दिखाई देती है।
माइक केस्किनोव

22

इसके बजाय उपयोग करें:

[sheet showFromTabBar:theTabBar];

1
मैंने इससे सुधार showInTabBar:किया showFromTabBar:। यह भी ध्यान दें कि एक 'showFromToolbar: `विधि है, जो स्क्रीन के नीचे आपके स्क्रीन फर्नीचर पर निर्भर करता है। यह, मुझे लगता है, स्वीकृत उत्तर की तुलना में बेहतर उत्तर है।
स्टीफन डार्लिंगटन

स्टीफन, उत्सुक है कि आपको क्यों लगता है कि यह प्रदर्शन दिखाने से बेहतर है। दृश्य: टैबर? युग्मन के दृष्टिकोण से, मुझे लगता है कि showInView शायद अधिक आदर्श होगा, अगर बाद में टैबबार पर छोड़ दिया जाता है, तो उदाहरण के लिए, टूलबार से प्रतिस्थापित किया जा सकता है। विशेष उप दृश्य नियंत्रक को वास्तव में जानना या देखभाल नहीं करना चाहिए, मुझे लगता है।
बिली ग्रे

यदि टैब बार को बाद में छोड़ दिया जाता है, तो आपको कोड की उस पंक्ति को संपादित करना होगा, जब तक कि (जब तक कि TABBar एक दृश्य के लिए खराब-नामित नाम नहीं है)। इसलिए मैं यह नहीं देखता कि यह तरीका किसी भी तरह से कैसा है। मैं showFromTabBar का उपयोग करता हूं: साथ ही, यह मुझे सुरक्षित लगता है। मुझे नहीं पता कि कवर के तहत क्या हो रहा है, लेकिन मुझे लगता है कि showFromTabBar: भविष्य के OS रिलीज़ में शोफ्रेम व्यू से टूटने की संभावना कम है: एक टैब बार दृश्य के साथ।
क्रिस्टोफर पिक्सले

10

यह तय है।

[actionsheet showInView:[UIApplication sharedApplication].keyWindow];

5

मुझे लगता है कि उत्तरों में से तीन का संयोजन इसे संभालने का सही तरीका है:

    [actionSheet showFromTabBar:self.tabBarController.tabBar];

यानी, showFromTabBar (यही कारण है कि यह मौजूद है) का उपयोग करें और आपको पेरेंट व्यू कॉन्ट्रॉलर की जरूरत नहीं है क्योंकि नातान ने बताया (वास्तव में, self.parentViewController.tabBarController.tabBar मेरे लिए शून्य है।


बेशक यह शून्य देता है, क्योंकि मूल दृश्य नियंत्रक (जो कि UITabBarViewController है) खुद को किसी अन्य UITabBarController में नेस्टेड नहीं करता है, इसलिए इसका tabBarController-property nil है।
डोमिनिक सीबॉल्ड

1

FYI करें - UIDocumentInteractionController की कार्यपत्रक के साथ एक ही समस्या थी टैब पर कदम रखने की। ठीक करने के लिए निम्नलिखित का उपयोग किया।

UIViewController *parentView = [[self parentViewController] parentViewController];
[docController presentOptionsMenuFromRect: rect inView: parentView.view animated:YES];

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.