Подклассификация 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
}