2011-03-10 11 views
25

आईफोन (आईओएस 4.2) पर यूआईएक्शनशीट का उपयोग करते समय मुझे एक अजीब समस्या मिली है। इस कोड पर विचार करें:6 से अधिक कस्टम बटन का उपयोग करते समय UIActionSheet बटन इंडेक्स मान दोषपूर्ण?

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  

    [self.window addSubview:viewController.view]; 
    [self.window makeKeyAndVisible]; 

    UIActionSheet *actionSheet = [[UIActionSheet alloc] 
            initWithTitle:@"TestSheet" 
            delegate:self 
            cancelButtonTitle:@"Cancel" 
            destructiveButtonTitle:nil 
            otherButtonTitles: nil]; 

    [actionSheet addButtonWithTitle:@"one"]; 
    [actionSheet addButtonWithTitle:@"two"]; 
    [actionSheet addButtonWithTitle:@"three"]; 
    [actionSheet addButtonWithTitle:@"four"]; 
    [actionSheet addButtonWithTitle:@"five"]; 
    [actionSheet addButtonWithTitle:@"six"]; 
    //uncomment next line to see the problem in action 
    //[actionSheet addButtonWithTitle:@"seven"]; 

    [actionSheet showInView:window]; 
    [actionSheet release]; 

    return YES; 
} 
- (void) actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { 
    NSLog(@"buttonIndex: %d, cancelButtonIndex: %d, firstOtherButtonIndex: %d", 
      buttonIndex, 
      actionSheet.cancelButtonIndex, 
      actionSheet.firstOtherButtonIndex); 
} 

यदि आप इस एप्लिकेशन को प्रारंभ करते हैं, तो कार्यपत्रक अपेक्षित व्यवहार करता है। इसका मतलब है कि रद्द करें बटनऑनएक्स हमेशा 0 है, और बटन इंडेक्स सही ढंग से रिपोर्ट किए जाते हैं। बटन "एक" के लिए 1 और इसी तरह। यदि आप सातवें बटन जोड़ने के लिए लाइन में टिप्पणी करते हैं, तो एक्शनशीट एक अतिरिक्त लाइन पर रद्द बटन के साथ, एक प्रकार का टेबलव्यू उत्पन्न करता है। अगर मैं इस मामले में "एक" बटन दबाता हूं, तो बटनइंडेक्स वैरिएबल 0 है, लेकिन रद्द है बटन बटन। यह बताना असंभव है कि उपयोगकर्ता ने "रद्द करें" या "एक" बटन टैप किया है या नहीं। ऐसा लगता है कि यह इस तरह से होना चाहिए। क्या कोई असहमत है? आपकी सहायता के लिए धन्यवाद.

+0

एक्शन शीट पर छह बटन? वास्तव में? मैं विकल्प के लिए एक टेबल का उपयोग करने का सुझाव देना चाहूंगा ... – Eimantas

+9

अच्छी तरह से एक वर्कशीट होने का क्या मतलब है जो स्क्रॉलव्यू में 6 से अधिक बटन संभाल सकता है यदि आप इसका उपयोग नहीं करना चाहते हैं? – huesforalice

+0

एक ही समस्या थी, यह एक बग स्पष्ट रूप से –

उत्तर

34

मैं एक ही मुद्दे में भाग गया, भले ही मैं पहले से ही एक्शन शीट में अंतिम बटन के रूप में रद्द बटन सहित था और तदनुसार अपनी अनुक्रमणिका सेट कर रहा था। मेरी समस्याओं को 'विनाशकारी' बटन से करना पड़ा।

  • के बाद एन बटन actionsheet में जोड़ा गया है, यह शीर्ष पर विनाशकारी बटन लगाना और बटन रद्द तल पर अपने लेआउट स्विच: कुछ जांच के बाद, यहाँ समस्या पर मेरी ले है। बीच में एक स्क्रोल करने योग्य दृश्य है जिसमें अन्य सभी बटन शामिल हैं। अन्य स्रोत इंगित करते हैं कि यह एक टेबल व्यू है।

  • एन पोर्ट्रेट अभिविन्यास के लिए 7 और लैंडस्केप अभिविन्यास के लिए 5 है। एन पोर्ट्रेट ओरिएंटेशन के लिए 9 है, 4 "स्क्रीन। ये नंबर रद्द और विनाशकारी सहित सभी बटनों के लिए हैं। स्पष्ट होने के लिए, एन स्विच से पहले बटन की सबसे बड़ी संख्या है। एन + 1 बटन UIActionSheet को स्विच करने का कारण बनता है स्क्रोल करने योग्य दृश्य।

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

  • समस्या यह है कि सूचकांक तदनुसार समायोजित नहीं कर रहे हैं। तो अगर आप शुरू में नहीं जोड़ा था, पिछले बटन और पहले के रूप में विनाशकारी रूप में रद्द, गलत सूचकांक actionSheet में सूचित किया जाएगा : clicke डीबटन एट इंडेक्स: प्रारंभिक रिपोर्ट के अनुसार।

  • तो, आप कार्रवाई करने के लिए चादर पहले बटन के रूप में actionSheet को विनाशकारी बटन जोड़ना होगा अगर आप अपने कार्रवाई शीट में एन बटन की तुलना में अधिक है करने के लिए जा रहे हैं। आपको एक्शन शीट में अंतिम बटन के रूप में रद्द करें बटन को जोड़ना होगा। प्रारंभ में जब शीट का निर्माण होता है तो दोनों को शून्य के रूप में छोड़ दें, जैसा कि किसी अन्य उत्तर में वर्णित है।

+1

यह वास्तव में सही उत्तर है - ऊपर वर्णित नहीं। पोस्टिंग के लिए अमीर के लिए धन्यवाद।पाठकों के लिए, बटनों के क्रम के संबंध में चौथी गोली का ध्यान रखें। – Christopher

+5

यह हास्यास्पद व्यवहार है। मुझे अकसर आश्चर्य होता है कि ऐप्पल कुछ निर्णय क्यों लेता है। यह उनमें से एक है। पारितोषिक के लिए धन्यवाद। – stephenmuss

13

मुझे अभी यह समस्या है। प्रारंभ में रद्द बटन सेट न करके इसे हल करें। मैं व्यक्तिगत रूप से बटन कुछ इस तरह सेट करें:

for(int index = 0; index < buttonTotal; index++) 
    { 
    [actionSheet addButtonWithTitle:[NSString stringWithFormat:buttonText, [buttonItems objectAtIndex: index]]]; 
    } 

    [actionSheet addButtonWithTitle:@"Cancel"]; 
    actionSheet.cancelButtonIndex = actionSheet.numberOfButtons; 

मेरा मानना ​​है कि शून्य सूचकांक destructiveButton द्वारा प्रयोग किया जाता है अगर आप इसे इसलिए अन्य बटन का उपयोग वहाँ से बढ़ेगी, जब, अन्यथा वे 0.

से शुरू कर देंगे निश्चित नहीं है कि मैं एक निश्चित राशि से ऊपर तालिका विकल्प से सहमत हूं, बटन स्क्रॉल करने योग्य सूची में डिफ़ॉल्ट हैं।

+0

धन्यवाद स्टीफन! – huesforalice

+18

आपको केवल 'actionSheet.cancelButtonIndex = [actionSheet addButtonWithTitle: @ "रद्द करें"]; ' – user102008

+0

स्थानीयकरण इस समाधान को तोड़ नहीं देगा? –

1

file a bug समस्या के बारे में। थोड़ा नमूना प्रोजेक्ट शामिल करें और उनसे वापस सुनने के लिए कुछ महीनों तक प्रतीक्षा करें।

अब आप अपने बटन स्थिर init में

UIActionSheet *actionSheet = [[UIActionSheet alloc] 
           initWithTitle:@"TestSheet" 
           delegate:self 
           cancelButtonTitle:@"Cancel" 
           destructiveButtonTitle:nil 
           otherButtonTitles: @"one", @"two", @"three", @"four", @"five", @"six", @"seven", nil]; 

काम करता है समस्याओं के बिना सेट कर सकते हैं।

+0

आपकी टिप के लिए धन्यवाद, मुझे बटन को सरणी से सेट करने की आवश्यकता है, उपरोक्त बस यह इंगित करने के लिए एक उदाहरण है कि addButtonWithTitle विधि काम नहीं कर रही है। – huesforalice

0

नीचे के रूप में पसंद है:

UIActionSheet *actionSheet = [[UIActionSheet alloc] 
           initWithTitle:@"TestSheet" 
           delegate:self 
           cancelButtonTitle:@"Cancel" 
           destructiveButtonTitle:@"Delete" 
           otherButtonTitles: @"one", @"two", @"three", @"four", @"five", @"six", @"seven", @"eight", nil]; 

इसका मतलब यह है कि destructiveButtonTitle के रूप में विनाशकारी बटन परिभाषित करते हैं। otherButtonTitles में विनाशकारी/रद्द बटन का उपयोग करने से बचें।

1

1) actionview

का उपयोग कर इन्स्तांत [[UIActionSheet alloc] InitWithTitle: प्रतिनिधि: cancelButtonTitle: destructiveButtonTitle: OtherButtonTitles:]

बिना या तो रद्द करें बटन या विनाशकारी बटन (उन्हें सेट शून्य करने के लिए)

2) [myActionSheet addButtonWithTitle:(NSString *)] का उपयोग करके सामान्य रूप से सभी बटन जोड़ें।

3) यदि आप एक विशेष बटन चाहते हैं, तो इसे चरण 2 के समान विधि का उपयोग करके जोड़ें, और शीर्षक को सेट करें (@"Cancel", उदाहरण के लिए);

4) अब कार्यपत्रक पर अंतिम बटन की अनुक्रमणिका में संपत्ति [myActionSheet setCancelButtonIndex:] सेट करें, जो रद्द बटन था। एक विनाशकारी बटन के लिए वही करो। (ये हैं -1 डिफ़ॉल्ट रूप से, जिसकी वजह से उन्हें नहीं दिखाया जा सकता है)

  • ध्यान दें कि एक विनाशकारी बटन हमेशा शीर्ष पर दिखाई देगा, और एक रद्द बटन हमेशा तल पर दिखाई देगा, उसे बदला नहीं जा सकता है।

  • इसके अलावा, आप निश्चित रूप से इंडेक्स 0 पर रद्द/विनाशकारी बटन जोड़ सकते हैं, और इसके बाद के सभी अन्य बटन जोड़ सकते हैं। हालांकि अब शून्य के बजाए आपके अन्य बटनों की पहली अनुक्रमणिका 1 है। यह भ्रमित हो सकता है यदि आपके पास एक सरणी है जो अलर्टव्यू बटन से मेल खाती है।

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