सरणी में पास करके UIActionSheet 'otherButtons' बनाएं, न कि वैरलिस्ट


110

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

तो मैं यूआईएशनशीट में इन शीर्षकों को कैसे पारित कर सकता हूं? मेरे द्वारा सुझाया गया वर्कअराउंड अन्यButtonTield में nil को पास करना है :, फिर addButtonWithTitle का उपयोग करके व्यक्तिगत रूप से बटन शीर्षक निर्दिष्ट करें:। लेकिन इसमें "रद्द करें" बटन को अंतिम की बजाय UIActionSheet पर पहले स्थान पर ले जाने की समस्या है; मैं चाहता हूं कि यह आखिरी हो।

वहाँ एक रास्ता है 1) तार की एक चर सूची के बदले में एक सरणी पास, या वैकल्पिक रूप से 2) रद्द बटन UIActionSheet के नीचे ले जाएँ?

धन्यवाद।


यकीन नहीं है कि यह काम करेगा, लेकिन UIActionSheet का कैंसिलबुटनइंडेक्स प्रॉपर्टी केवल-पढ़ने के लिए नहीं है। इसे सेट करने का प्रयास करें और देखें कि क्या बटन का क्रम बदलता है?
5In10 खोया

जवाबों:


248

मुझे यह काम करने के लिए मिला (आपको बस एक नियमित बटन के साथ ठीक होना चाहिए, और इसके बाद इसे जोड़ना होगा:

NSArray *array = @[@"1st Button",@"2nd Button",@"3rd Button",@"4th Button"];

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

    // ObjC Fast Enumeration
    for (NSString *title in array) {
        [actionSheet addButtonWithTitle:title];
    }

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

    [actionSheet showInView:self.view];

19
यह काम; धन्यवाद। पता ही नहीं चला कि कैंसिलबटनइंडेक्स प्रॉपर्टी सेट की जा सकती है। एक बात मुझे लगता है कि हम सभी इस पर सहमत हो सकते हैं: इस बेकार के लिए ऐप्पल का एपीआई।
ग्रेग मैलेटिक

11
मैं इसे अपनी सहमति देता हूँ! और उनके प्रलेखन का 99,99% भी बेकार है। यह उस भाषा को जाने बिना पुरातन हेब्रॉ में लिखी गई पुस्तक से मस्तिष्क की सर्जरी सीखने की कोशिश करने जैसा है।
डक

4
मेरी बहुत इच्छा है कि मैं इसे कई और बार वोट कर सकूं। क्रैकिंग उत्तर और मुझे विश्वास नहीं हो रहा है कि मैं इस बारे में लंबे समय से नहीं जानता हूं!
मटजग्लौय

1
@JimThio cancelButtonलाल नहीं है। destructiveButtonलाल है।
आर्मिन

1
अफसोस की बात है, यह समाधान यूआईएशनशीट में एक बग से ग्रस्त है जो [UIActionSheet addButtonWithTitle]सही तरीके से सेट नहीं लगता है firstOtherButtonIndex(जिसका उपयोग प्रतिनिधि को actionSheet:clickedButtonAtIndex:हार्डकॉडिंग 0 या इसी तरह के सामान के बजाय किया जाना चाहिए )। एक परिवर्तित साथ बुरा हो रही NSArrayकरने के लिए va_listएक महान समाधान की तरह ध्वनि नहीं करता है या तो। :-( यह एपीआई इतनी बदसूरत है।
डैनियल रिंसर

78

एक छोटा सा नोट: [एक्शनशीट addButtonWithTitle:] उस बटन के इंडेक्स को लौटाता है, ताकि आप सुरक्षित रहें और "क्लीन" कर सकें:

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

क्या इससे रद्द बटन लाल हो जाएगा?
user4951

1
@JimThio नहीं, लाल बटन को "डिस्ट्रक्टिवबटन" कहा जाता है, और इसके destructiveButtonIndexलिए एक संबंधित संपत्ति है
निक

3

जाबा और निक के जवाबों को लेते हुए और उन्हें थोड़ा आगे बढ़ाया। इस समाधान में एक विनाश बटन शामिल करने के लिए:

// Create action sheet
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:title
                                                         delegate:self
                                                cancelButtonTitle:nil
                                           destructiveButtonTitle:nil
                                                otherButtonTitles:nil];
// Action Buttons
for (NSString *actionName in actionNames){
    [actionSheet addButtonWithTitle: actionName];
}

// Destruction Button
if (destructiveName.length > 0){
    [actionSheet setDestructiveButtonIndex:[actionSheet addButtonWithTitle: destructiveName]];
}

// Cancel Button
[actionSheet setCancelButtonIndex: [actionSheet addButtonWithTitle:@"Cancel"]];

// Present Action Sheet
[actionSheet showInView: self.view];

1

प्रतिक्रिया के लिए स्विफ्ट संस्करण है:

//array with button titles
private var values = ["Value 1", "Value 2", "Value 3"]

//create action sheet
let actionSheet = UIActionSheet(title: nil, delegate: self, cancelButtonTitle: nil, destructiveButtonTitle: nil)
//for each value in array
for value in values{
    //add a button
    actionSheet.addButtonWithTitle(value as String)
}
//display action sheet
actionSheet.showInView(self.view)

मान चयनित करने के लिए, अपने ViewController में प्रतिनिधि जोड़ें:

class MyViewController: UIViewController, UIActionSheetDelegate

और विधि पर क्लिक करें "clickedButtonAtIndex"

func actionSheet(actionSheet: UIActionSheet, clickedButtonAtIndex buttonIndex: Int) {
    let selectedValue : String = values[buttonIndex]
}

भविष्य के उपयोगकर्ताओं के लिए ... यह काम किया ... लेकिन यह पदावनत है ... stackoverflow.com/a/41322537/884674
jeet.chanchawat
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.