एक्शनशीट आईपैड काम नहीं कर रहा है


86

मैं अपने आवेदन में ActionSheet का उपयोग कर रहा हूं। मेरे iPhone पर यह काम करता है, लेकिन यह iPad सिम्युलेटर पर नहीं है।

यह मेरा कोड है:

@IBAction func dialog(sender: AnyObject) {

    let optionMenu = UIAlertController(title: nil, message: "Choose Option", preferredStyle: .ActionSheet)
    let deleteAction = UIAlertAction(title: "Delete", style: .Default, handler: {

        (alert: UIAlertAction!) -> Void in
        println("Filtre Deleted")
    })

    let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: {
        (alert: UIAlertAction!) -> Void in
        println("Cancelled")
    })

    optionMenu.addAction(deleteAction)
    optionMenu.addAction(cancelAction)

    self.presentViewController(optionMenu, animated: true, completion: nil)
}

और मेरी त्रुटि:

अनकैप्ड अपवाद 'NSGenericException' के कारण ऐप को समाप्त करना, कारण: 'आपके आवेदन ने UIAlertControllerStyleActionSheet शैली का एक UIAlertController () प्रस्तुत किया है। इस शैली के साथ एक UIAlertController के modalPresentationStyle UIModalPresentationPopover है। आपको इस कंट्रोलर के पॉपुलर कंट्रोलर पॉपओरेन्सेन्टेशन कंट्रोलर के माध्यम से लोकेशन की जानकारी देनी होगी। आपको या तो एक sourceView और sourceRect या एक barButtonItem प्रदान करना होगा। यदि यह जानकारी ज्ञात नहीं है जब आप अलर्ट नियंत्रक प्रस्तुत करते हैं, तो आप इसे UIPopoverPresentationControllerDelegate विधि -prepareForPopoverPresentation में प्रदान कर सकते हैं। '


यह लिंक आपकी मदद कर सकता है।
निमिषा पटेल

4
ios 8 और इसके बाद का कोई एक्शन शीट नहीं है UIActionController उदाहरण u को UIAlertControllerStyleActionSheet के रूप में टाइप करने की आवश्यकता है .... यह आपकी मदद कर सकता है .... हालाँकि iPad के लिए uipopover का सुझाव दिया गया है ...
अरुण

आपको इसे iPad पर एक
पॉपओवर के

जवाबों:


110

आपको विकल्प प्रस्तुत करने से पहले एक स्रोत दृश्य या बटन प्रदान करने की आवश्यकता है क्योंकि iPad पर UIPopoverPresentationController के बाद से, जैसा कि यह आपकी त्रुटि में है। इसका मतलब यह है कि आपका एक्शन शीट बटन को इंगित करता है जिससे उपयोगकर्ता को यह पता चल जाता है कि यह कहां से शुरू हुआ था।

उदाहरण के लिए, यदि आप सही नेविगेशन बार आइटम पर टैप करके अपना विकल्प प्रस्तुत कर रहे हैं। आप ऐसा कुछ कर सकते हैं:

optionMenu.popoverPresentationController?.barButtonItem = self.navigationItem.rightBarButtonItem

self.presentViewController(optionMenu, animated: true, completion: nil)

या आप इस तरह से एक दृश्य सेट कर सकते हैं: (आपको बस इन 2 में से एक की आवश्यकता है)

optionMenu.popoverPresentationController?.sourceView = yourView

self.presentViewController(optionMenu, animated: true, completion: nil)

यह भी ध्यान रखें कि यदि आप एक्शन शीट के बजाय अपने UIAlertControllerStyle को अलर्ट में बदलते हैं, तो आपको इसे निर्दिष्ट करने की आवश्यकता नहीं होगी। मुझे यकीन है कि आपने इसका पता लगा लिया होगा, लेकिन मैं इस पृष्ठ पर आने वाले किसी भी व्यक्ति की मदद करना चाहता था।


30

मेरे लिए भी यही समस्या है। मेरे पास एक UIAlertController थी जो फोन पर ठीक काम करती थी, लेकिन iPad पर दुर्घटनाग्रस्त हो गई। जब कोई कक्ष तालिका दृश्य से टैप किया जाता है तो शीट पॉप अप हो जाती है।

स्विफ्ट 3 के लिए, मैंने इसे प्रस्तुत करने से ठीक पहले कोड की 3 लाइनें जोड़ीं:

        ...

        sheet.popoverPresentationController?.sourceView = self.view
        sheet.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection()
        sheet.popoverPresentationController?.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0)


        self.present(sheet, animated: true, completion: nil)

1
यह मेरे लिए स्विफ्ट 5.0 में काम करता है लेकिन मुझे नहीं पता कि दृश्य के नीचे से पॉप-अप कैसे दिखाया जाए। धन्यवाद!
फ्लोरेंटिन लुपस्कु

@FlorentinLupascu: UIPopoverArrowDirection.Down और sourceRect = CGRect (x: self.view.bounds.midX, y: self.view.bounds.bottom, चौड़ाई: 0, ऊँचाई: 0)
दें

24

स्विफ्ट 3

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

नेविगेशन बार के लिए उदाहरण:

    // 1
    let optionMenu = UIAlertController(title: nil, message: "Choose an option", preferredStyle: .actionSheet)

    // 2
    let deleteAction = UIAlertAction(title: "Option 1", style: .default, handler: {
        (alert: UIAlertAction!) -> Void in
        print("option 1 pressed")
    })
    let saveAction = UIAlertAction(title: "Option 2", style: .default, handler: {
        (alert: UIAlertAction!) -> Void in
        print("option 2 pressed")
    })

    //
    let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: {
        (alert: UIAlertAction!) -> Void in
        print("Cancelled")
    })


    // 4

    optionMenu.addAction(deleteAction)
    optionMenu.addAction(saveAction)
    optionMenu.addAction(cancelAction)

    // 5

    optionMenu.popoverPresentationController?.barButtonItem = self.navigationItem.rightBarButtonItem

    self.present(optionMenu, animated: true) { 
        print("option menu presented")
    }

8

यदि आप इसे बिना किसी तीर के साथ केंद्र में प्रस्तुत करना चाहते हैं [ 3+ स्विफ्ट ]:

if let popoverController = optionMenu.popoverPresentationController {
        popoverController.sourceView = self.view
        popoverController.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0)
        popoverController.permittedArrowDirections = []
    }
self.present(optionMenu, animated: true, completion: nil)

5

प्रस्तुत करने से पहले निम्नलिखित शब्दों में कथन जोड़ें।

optionMenu.popoverPresentationController.sourceView = self.view;
optionMenu.popoverPresentationController.sourceRect = 

CGRectMake(0,0,1.0,1.0);


@IBAction func dialog(sender: AnyObject) {
    ...

    optionMenu.popoverPresentationController.sourceView = self.view;
    optionMenu.popoverPresentationController.sourceRect = CGRectMake(0,0,1.0,1.0);

    self.presentViewController(optionMenu, animated: true, completion: nil)
}

यह अच्छी तरह से काम करेगा।


पूरी तरह से काम किया। केवल एक चीज यह है कि आपको लेफ्ट नेविगेशन बार आइटम जोड़ने की आवश्यकता है, इसलिए पॉपओवर मेनू ऐसा नहीं लगता है कि यह कहीं से भी बाहर नहीं आ रहा है
यूजीन पावलोव

0

बस ध्यान दें कि यदि आप IB में सोर्सव्यू को अपने ऐप में संबंधित चर से लिंक नहीं किया है, तो आपको यह त्रुटि भी हो सकती है।


0

आपको Ipad के लिए इसे जोड़ने की आवश्यकता है

alertControler.popoverPresentationController?.sourceView = self.view


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