Подтвердить что ты не робот

UIAlertController: поддерживаетсяInterfaceOrientations вызывается рекурсивно

Когда два оповещения появляются один за другим, я подразумеваю присутствие одного предупреждения и над ним появляется другое предупреждение и сбой приложения. Я использовал UIAlertController для отображения предупреждения. Ошибка приложения только в устройстве iOS 9.

Пожалуйста, помогите мне на этом этапе.

4b9b3361

Ответ 1

Это ошибка в iOS 9, которая не смогла получить supportedInterfaceOrientations для UIAlertController. И кажется, что он упал до бесконечной петли рекурсии при поиске supportedInterfaceOrientations для UIAlertController (например, он возвращается к UIAlertControlerUIViewControllerUINavigationControllerUITabBarControllerUIAlertController → ...), в то время как вызов UIAlertController:supportedInterfaceOrientations фактически не реализован/переопределен в исходном коде.

В моем решении я просто добавил следующий фрагмент кода:

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

Затем UIAlertController будет напрямую возвращать поддерживаемое значение ориентации без бесконечного цикла. Надеюсь, что это поможет.

Изменить: Swift 3.0.1

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

Ответ 2

Мое решение - это категория Objective-C для UIAlertViewController. Просто включите UIAlertController + supportedInterfaceOrientations.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

Ответ 3

В качестве ответа на вопрос Roland Keesom выше, это то, что сработало для меня. Основное отличие состоит в том, что функция supportedInterfaceOrientations фактически возвращает UIInterfaceOrientationMask, а не Int.

И в этом варианте поддерживаются все ориентации.

extension UIAlertController {

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

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

Ответ 4

Написание расширения казалось логичным для меня, но я получил

Переопределение "shouldAutorotate" должно быть таким же доступным, как и объявление, которое оно переопределяет

при его реализации. Но я нашел другое решение. Я написал класс, который расширяет UIAlertController и переопределяет функции supportedInterfaceOrientations и shouldAutorotate в этом классе. Надеюсь, это поможет.

class MyUIAlertController : UIAlertController {

       override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
              return [UIInterfaceOrientationMask.Portrait,UIInterfaceOrientationMask.PortraitUpsideDown]
       }

       override func shouldAutorotate() -> Bool {
            return false
       }
}

Ответ 5

Я столкнулся с этой проблемой в бета-версиях iOS 9. Но похоже, что яблоко разрешилось в финальном выпуске iOS 9.

Ответ 6

Это также можно решить, всегда отображая контроллер предупреждений во вновь создаваемом интерфейсе UIWindow. См. этот SO ответ о том, как создать категорию, которая позволяет всегда отображать ваши предупреждения таким образом.