2009-10-26 7 views
21

मुझे एक ऐसे एप्लिकेशन में एक आवश्यकता है जहां मुझे गतिशील रूप से अन्य बटन स्विच जोड़ने में सक्षम होना चाहिए, जो उपयोगकर्ता ने सेटिंग्स में निर्दिष्ट कुछ बूल स्विच पर निर्भर किया है। हालांकि, मुझे यह पता लगाना प्रतीत नहीं होता कि UIActionSheet प्रारंभ में ऐसा करने के बारे में कैसे जाना है। मैंने बिना किसी किस्मत के एनएसएसटींग सरणी (एनएसएसटींग [2]), और एनएसएआरएआरए पास करने की कोशिश की है।आईफोन एसडीके - यूआईएक्शनशीट - डायनामिक बटन टाइटल

यहां कोई भी सहायता की सराहना की जाती है।

उत्तर

58

यह करने के लिए सबसे आसान तरीका है कि मैं शुरू में कोई बटन के साथ अपनी कार्रवाई पत्रक बनाने है पाया है, कोई रद्द करने या विनाशकारी बटन सहित:

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

तो जरूरत के रूप में बटन के एक लोड जोड़ें:

if(buttonX) 
{ 
    [actionSheet addButtonWithTitle:@"Button X"]; 
} 
if(buttonY) 
{ 
    [actionSheet addButtonWithTitle:@"Button Y"]; 
} 
if(buttonZ) 
{ 
    [actionSheet addButtonWithTitle:@"Button Z"]; 
} 

फिर अंत में अंत में बटन को रद्द जोड़ सकते हैं और रद्द बटन सूचकांक सेट:

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

बेशक आप इस तरह से एक रद्द बटन और/या एक विनाशकारी बटन जोड़ सकते हैं।

+1

@harrywynn, आपको शायद इसे उत्तर के रूप में चिह्नित करना चाहिए (या उनमें से एक कम से कम)। –

+0

ध्यान दें कि रद्द बटन बटन नहीं दिखाते हैं जहां UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad। मैंने यह जानने का प्रयास करने में 20 मिनट बिताए कि मेरा बटन रद्द करने के बाद क्यों नहीं दिखाई देगा बटन बटन इंडेक्स :) –

6

आप addButtonWithTitle: विधि के साथ (पहले से प्रारंभ किए गए) UIActionSheet में नए बटन जोड़ सकते हैं। आप अपने कस्टम UIButtons भी बना सकते हैं और उन्हें UVctionSheet के दृश्य में subViews

+0

मैं 'addButtonWithTitle:' का उपयोग कर रहा था, फिर इसे पहचानने के लिए 'setCancelButtonIndex' का उपयोग करके अंतिम "के रूप में" रद्द करें "बटन जोड़ रहा था। समस्या तब होती है जब स्क्रीन पर फिट होने से आपके पास अधिक बटन होते हैं, यह एक UITableView पर स्विच करता है, और बटन तालिका में कक्ष बन जाते हैं। यदि आपके पास 'cancelButtonTitle' के माध्यम से निर्दिष्ट एक वास्तविक रद्द करें बटन नहीं है, तो शीट को बंद करने का कोई तरीका नहीं है क्योंकि कोई बटन दिखाई नहीं देता है। आपको उस बिंदु पर ऐप से बाहर निकलना होगा। एक उदाहरण के लिए इन स्क्रीन देखें: http://conceptcache.com/tmp/with_cancel_button.png http://conceptcache.com/tmp/without_cancel_button.png – harrywynn

+0

कि अजीब बात है - मैं सिर्फ 20 बटन के साथ UIActionSheet बना लिया है (उन सभी को अटूट बटन के साथ जोड़ा गया: कॉल)। शीट ठीक से खारिज कर देती है और दोनों ने किया है DismissWithButtonIndex: और क्लिक किया गया बटनऑट इंडेक्स: प्रतिनिधि विधियों को बुलाया जाता है ... आप किस एसडीके का उपयोग कर रहे हैं? – Vladimir

1

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

चेक presentModalViewController:animated और dismissModalViewController:animated:

उपयोगकर्ता अपने मोडल दृश्य को खारिज करते हुए जब के लिए दस्तावेज़, आपका प्रतिनिधि एक विधि आप का निर्माण प्राप्त कर सकते हैं, जैसे customActionSheetDidFinish:(int)buttonChosen

2

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

// button titles  
NSMutableArray *buttons = [[NSMutableArray alloc] init]; 
[buttons addObject:@"Button 1"]; 
[buttons addObject:@"Button 2"]; 

// placeholders 
NSString *button0 = nil, *button1 = nil, *button2 = nil; 

// put together the buttons 
for (int x = 0; x < buttons.count; x++) { 
    switch (x) { 
     case 0: 
      button0 = [buttons objectAtIndex:x]; 
      break; 
     case 1: 
      button1 = [buttons objectAtIndex:x]; 
      break; 
     case 2: 
      button2 = [buttons objectAtIndex:x]; 
      break; 
    } 
} 

// action sheet 
UIActionSheet *option = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:button0, button1, button2, nil]; 

आशा है कि यह समान दुविधा का सामना करने वाले अन्य लोगों के लिए उपयोगी होगा।

+0

और यदि आपको 20 या 30 बटन की आवश्यकता है तो आप क्या करेंगे? – Vladimir

+0

ठीक है, मुझे केवल अधिकतम 5 की आवश्यकता है, इसलिए यह इस विशेष एप्लिकेशन के लिए काम करता है। यदि आपको 20 या 30 की आवश्यकता है तो शायद यह व्यावहारिक नहीं होगा। – harrywynn