objective c - UIAlertController: supportInterfaceOrientations को पुनरावर्ती रूप से लागू किया गया था




objective-c ios9 (4)

ऊपर, रोलाण्ड कीसोम के जवाब के अपडेट के रूप में, यह मेरे लिए काम कर रहा है। मुख्य अंतर यह है कि supportInterfaceOrientations फ़ंक्शन वास्तव में UIInterfaceOrientationMask को इंट के बजाय लौटाता है।

और इस संस्करण में सभी झुकावों का समर्थन किया जाता है।

extension UIAlertController {

    public override func shouldAutorotate() -> Bool {
        return true
    }

    public override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        return UIInterfaceOrientationMask.All
    }
}

जब दो अलर्ट एक-एक करके पेश होते हैं, तो मेरा मतलब है कि एक अलर्ट मौजूद है और उनके ऊपर एक और अलर्ट प्रेजेंटिंग और ऐप क्रैश हो रहा है। मैंने चेतावनी प्रदर्शित करने के लिए UIAlertController का उपयोग किया है। ऐप केवल iOS 9 डिवाइस में क्रैश हो रहा है।

कृपया इस बिंदु पर मेरी मदद करें।


मेरा समाधान UIAlertViewController के लिए एक उद्देश्य-सी श्रेणी है। बस UIAlertController + supportInterfaceOrientations.h को उन सभी वर्गों में शामिल करें जो UIAlertController का उपयोग करते हैं

UIAlertController + supportedInterfaceOrientations.h

//
//  UIAlertController+supportedInterfaceOrientations.h

#import <UIKit/UIKit.h>
@interface UIAlertController (supportedInterfaceOrientations)
@end

UIAlertController + supportedInterfaceOrientations.m

//
//  UIAlertController+supportedInterfaceOrientations.m

#import "UIAlertController+supportedInterfaceOrientations.h"

@implementation UIAlertController (supportedInterfaceOrientations)

#if __IPHONE_OS_VERSION_MAX_ALLOWED < 90000
- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}
#else
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}
#endif

@end

यह iOS 9 में एक बग है जो UIAlertController लिए supportedInterfaceOrientations UIAlertController को पुनर्प्राप्त करने में विफल रहा। और ऐसा लगता है कि यह UIAlertController लिए supportedInterfaceOrientations UIAlertController तलाश में एक अनंत रिकर्सन लूप पर गिरा दिया गया (उदाहरण के लिए, यह UIAlertControler -> UIViewController -> UINavigationController -> UITabBarController > UIAlertController -> UIAlertController -> पर वापस ट्रैक करता है) UIAlertController:supportedInterfaceOrientations वास्तव में स्रोत कोड में लागू / ओवरराइड नहीं है।

मेरे समाधान में, मैंने निम्नलिखित कोड जोड़ा है:

extension UIAlertController {     
    public override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        return UIInterfaceOrientationMask.Portrait
    }
    public override func shouldAutorotate() -> Bool {
        return false
    }
}

तब UIAlertController सीधे अनंत लूप के बिना समर्थित अभिविन्यास मूल्य लौटाएगा। आशा करता हूँ की ये काम करेगा।

संपादित करें: स्विफ्ट 3.0.1

extension UIAlertController {
    open override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return UIInterfaceOrientationMask.portrait
    }  
    open override var shouldAutorotate: Bool {
        return false
    }
}

यह हमेशा नए बनाए गए UIWindow में अलर्ट कंट्रोलर प्रदर्शित करके भी हल किया जा सकता है। एक श्रेणी बनाने के बारे में इस SO उत्तर को देखें जो आपको इस तरह से हमेशा अपने अलर्ट प्रदर्शित करने की अनुमति देता है।







xcode7-beta3