我遇到与此问题中解释的相同的问题:
我的问题是如何在我的app委托中实现一个'window'getter方法,返回'MyWindow'子类?或者也许有其他方法可以将我的子类分配到我的应用程序的主窗口?
答案 0 :(得分:75)
UIWindow
参考中所述,Storyboard项目中的 UIApplicationDelegate
可以进行子类化:
窗口
在使用故事板时,应用程序必须显示 故事板通过将其添加到窗口并将该窗口放在屏幕上。 应用程序在窗口中查询此属性。保留 这个属性引用窗口是必要的,以保持 窗口被释放。如果属性的值是nil
( 默认情况下,应用程序创建UIWindow
的通用实例 将其分配给此属性以供委托引用。你可以 实现此协议的getter方法来提供 应用程序使用不同的窗口。
换句话说,在AppDelegate
实现中,只需添加以下getter
<强>目标C 强>
- (MyCustomWindow *)window
{
static MyCustomWindow *customWindow = nil;
if (!customWindow) customWindow = [[MyCustomWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
return customWindow;
}
<强>夫特强>
var customWindow: MyCustomWindow?
var window: UIWindow? {
get {
customWindow = customWindow ?? MyCustomWindow(frame: UIScreen.mainScreen().bounds)
return customWindow
}
set { }
}
答案 1 :(得分:1)
在我自己的应用程序中,我在从Xcode模板创建新应用程序时看到了在AppDelegate.h中声明的“window
”属性。
您可以修改该属性,以便在此时从“UIWindow
”更改为“MyWindow
”。
或者,不太优雅的解决方案,您可以在访问时简单地将window
转换为“MyWindow
”对象类型。
答案 2 :(得分:1)
你并没有那么努力去第一个子类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
}
答案 3 :(得分:0)
UIApplicationDelegate
协议具有window
属性,您可以使用
import UIKit
class CustomWindow : UIWindow {
//...
}
class AppDelegate: UIResponder, UIApplicationDelegate {
var customWindow: CustomWindow?
var window: UIWindow? {
get {
customWindow = customWindow ?? CustomWindow(frame: UIScreen.main.bounds)
return customWindow
}
set { }
}
//...
}
此解决方案仅返回自定义UIWindow