iphone - स्विफ्ट UIAlertController-> एक्शनशीट आईपैड आईओएस 8 क्रैश




ipad swift (3)

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

मैं केवल एक बटन के साथ एक नई परियोजना बनाते हैं

import UIKit

extension ViewController : UIActionSheetDelegate {

    func actionSheet(actionSheet: UIActionSheet, didDismissWithButtonIndex buttonIndex: Int) {

        if actionSheet.tag == 0 {
            if buttonIndex == 1 {
                // doing something for "product page"
            } else if (buttonIndex == 2) {
                // doing something for "video"
            }
        }
    }

}

class ViewController: UIViewController, UIActionSheetDelegate {
    @IBAction func test(sender: AnyObject) {

        let systemVersion: NSInteger = (UIDevice.currentDevice().systemVersion as NSString).integerValue
        if systemVersion < 8 {
            // iOS7:
            let action:UIActionSheet = UIActionSheet(title: "Change Map Type", delegate: self, cancelButtonTitle: "Back", destructiveButtonTitle: nil, otherButtonTitles: "Product Page", "Video")
            action.tag = 0
            action.showInView(self.view)
        } else {
            // iOS8:
            let alertController: UIAlertController = UIAlertController(title: "Change Map Type", message: nil, preferredStyle: UIAlertControllerStyle.ActionSheet)
            let cancelAction: UIAlertAction = UIAlertAction(title: "Back", style: UIAlertActionStyle.Cancel, handler: nil)
            let button1action: UIAlertAction = UIAlertAction(title: "Product Page", style: UIAlertActionStyle.Default, handler: { (action: UIAlertAction!) -> () in
                // doing something for "product page"
            })
            let button2action: UIAlertAction = UIAlertAction(title: "Video", style: UIAlertActionStyle.Default, handler: { (action: UIAlertAction!) -> () in
                // doing something for "video"
            })
            alertController.addAction(cancelAction)
            alertController.addAction(button1action)
            alertController.addAction(button2action)

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

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

}

जैसा कि मैंने आईफोन पर कहा था, यह काम करता है, लेकिन अगर मैं आईपैड पर बटन क्लिक करता हूं तो ऐप क्रैश हो जाता है

2014-09-25 14: 54: 52.784 परीक्षण [9 541: 1 9 70048] * अनजान अपवाद 'NSGenericException' के कारण ऐप को समाप्त करना, कारण: 'आपके एप्लिकेशन ने UIAlertControllerStyleActionSheet शैली का UIAlertController () प्रस्तुत किया है। इस शैली के साथ एक UIAlertController का modalPresentationStyle UIModalPresentationPopover है। आपको इस पॉपओवर के लिए अलर्ट कंट्रोलर के पॉपओवर प्रस्तुति नियंत्रक के माध्यम से स्थान जानकारी प्रदान करनी होगी। आपको या तो स्रोत दृश्य और स्रोत संदर्भ या बारबटन इटिम प्रदान करना होगा। यदि आप सूचना चेतावनी प्रस्तुत करते समय यह जानकारी ज्ञात नहीं है, तो आप इसे UIPopoverPresentationControllerDelegate विधि -prepareForPopoverPresentation में प्रदान कर सकते हैं। ' * पहले फेंक कॉल स्टैक: (0 कोरफाउंडेशन 0x00613df6 अपवाद प्रीप्रोसेस + 182 1 libobjc.A.dylib
0x01fdaa97 objc_exception_throw + 44 2 UIKit
0x0164da37 - [UIPopoverPresentationController प्रस्तुति ट्रांजिशनविल्लबीजिन] + 3086 3 UIKit
0x00f54f75 __71- [UIPresentationController _initViewHierarchyForPresentationSuperview:] _ block_invoke + 1666 4 UIKit 0x00f53554 __56- [UIPresentationController runTransitionForCurrentState] _block_invoke + 226 5 UIKit
0x00f8721b __40 + [UIViewController _scheduleTransition:] _ block_invoke + 18 6 UIKit 0x00e4d62e ___afterCACommitHandler_block_invoke + 15 7 UIKit 0x00e4d5d9 _applyBlockToCFArrayCopiedToStack + 415 8 UIKit
0x00e4d3ee _afterCACommitHandler + 545 9 कोरफाउंडेशन
0x00536fbe __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION + 30 10 कोरफाउंडेशन 0x00536f00 __CFRunLoopDoObservers + 400 11 कोरफाउंडेशन 0x0052c93a __CFRunLoopRun + 1226 12 कोरफाउंडेशन 0x0052c1ab CFRunLoopRunSpecific + 443 13 कोरफाउंडेशन
0x0052bfdb CFRunLoopRunInMode + 123 14 ग्राफिक्स सर्विसेज
0x0438424f GSEventRunModal + 192 15 ग्राफिक्स सर्विसेज
0x0438408c GSEventRun + 104 16 UIKit
0x00e23e16 यूआईपीप्लिकेशंस + 1526 17 टेस्ट
0x00085e9e top_level_code + 78 18 परीक्षण
0x00085edb मुख्य + 43 1 libdyld.dylib
0x0273eac9 शुरू + 1 20 ???
0x00000001 0x0 + 1) libc ++ abi.dylib: प्रकार एनएसईएक्सप्शन के बेजोड़ अपवाद के साथ समाप्त

परियोजना डाउनलोड और कोशिश करने के लिए https://www.dropbox.com/s/54jqd8nsc67ll5g/test.zip?dl=0 पर पाई जा सकती है।


var actionSheet = UIAlertController (शीर्षक: "कृपया कैमरा या फोटो लाइब्रेरी का चयन करें", संदेश: "", पसंदीदा स्टाइल: .actionSheet)

    if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.pad ){
        actionSheet = UIAlertController(title: "Please Select Camera or Photo Library", message: "", preferredStyle: .alert)
    }

    actionSheet.addAction(UIAlertAction(title: "Upload a Photo", style: .default, handler: { (UIAlertAction) in
        self.openPhotoLibrary()
    }))
    actionSheet.addAction(UIAlertAction(title: "Take a Photo", style: .default, handler: { (UIAlertAction) in
        self.openCamera()
    }))
    actionSheet.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
    self.present(actionSheet, animated: true, completion: nil)

इसे इस्तेमाल करे

alertController.popoverPresentationController?.sourceView = self.view

नेट कुक पूरी तरह से सही है हालांकि मैं ऐसा करूँगा इसलिए मुझे पता है कि यह आईपैड या आईफोन है या नहीं।

यह barButtonItem :

if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.pad ){

            if let currentPopoverpresentioncontroller = alertController.popoverPresentationController{
                currentPopoverpresentioncontroller.barButtonItem = sender as! UIBarButtonItem
                currentPopoverpresentioncontroller.permittedArrowDirections = UIPopoverArrowDirection.down;
                self.present(alertController, animated: true, completion: nil)
            }
        }else{
            self.present(alertController, animated: true, completion: nil)
        }




uiactionsheet