Подклассификация UIWindow при использовании раскадровки

У меня такая же проблема, как объясняется в этом вопросе:

Где я могу изменить окно, которое мое приложение использует из UIWindow для моего собственного подкласса "MyWindow" ? с раскадрой?

Мой вопрос заключается в том, как реализовать метод getter в окне моего приложения, который возвращает подкласс MyWindow? Или, может быть, есть другие способы присвоить мой подкласс главному окну моего приложения?

Ответ 1

UIWindow в проекте Storyboard можно подклассифицировать, как описано в справочнике Apple UIApplicationDelegate:

окно
Когда используется раскадровка, приложение должно представить раскадровки, добавив его в окно и помещая это окно на экран. Приложение запрашивает это свойство для окна. Сохраненный ссылку на окно этим свойством необходимо сохранить окна от выпуска. Если значение свойства nil ( default), приложение создает общий экземпляр UIWindow и присвойте это свойство этому делегату для ссылки. Вы можете внедрить метод геттера этого протокола, чтобы обеспечить приложение с другим окном.

Другими словами, в вашей реализации AppDelegate просто добавьте следующий getter

Objective-C

- (MyCustomWindow *)window
{    
    static MyCustomWindow *customWindow = nil;
    if (!customWindow) customWindow = [[MyCustomWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    return customWindow;
}

Swift

var customWindow: MyCustomWindow?    
var window: UIWindow? {
    get {
        customWindow = customWindow ?? MyCustomWindow(frame: UIScreen.mainScreen().bounds)
        return customWindow
    }
    set { }
}

Ответ 2

В моих собственных приложениях я видел свойство < window ", объявленное в AppDelegate.h, при создании нового приложения из шаблонов Xcode.

Вы можете изменить это свойство, чтобы изменить его с "UIWindow" на "MyWindow" в этой точке.

Или, менее элегантное решение, вы можете просто придать window вернуться к типу объекта "MyWindow" при обращении к нему.

Ответ 3

Не так сложно вы собираетесь в первый подкласс UIWindow

class WinCustom : UIWindow{ 
....
}

затем в AppDelegate:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    self.window = WinCustom(frame: UIScreen.main.bounds)

    self.window?.rootViewController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController()

    return true
}