【发布时间】:2012-05-11 07:13:27
【问题描述】:
我遇到了与此问题中解释的相同的问题:
我的问题是如何在我的应用程序委托中实现一个返回“MyWindow”子类的“window”getter 方法?或者也许还有其他方法可以将我的子类分配给我的应用程序的主窗口?
【问题讨论】:
标签: iphone objective-c ios cocoa-touch uiwindow
我遇到了与此问题中解释的相同的问题:
我的问题是如何在我的应用程序委托中实现一个返回“MyWindow”子类的“window”getter 方法?或者也许还有其他方法可以将我的子类分配给我的应用程序的主窗口?
【问题讨论】:
标签: iphone objective-c ios cocoa-touch uiwindow
在我自己的应用程序中,我看到在从 Xcode 模板创建新应用程序时在 AppDelegate.h 中声明了“window”属性。
此时您可以修改该属性以从“UIWindow”更改为“MyWindow”。
或者,一个不太优雅的解决方案,您可以简单地将window 的返回值转换为“MyWindow”对象类型。
【讨论】:
MyWindow——它们只是错误地将已经存在的UIWindow 转换为MyWindow。
window”属性的 getter 方法返回 MyWindow。
Storyboard 项目中的UIWindow 可以按照 Apple 的 UIApplicationDelegate 参考中的说明进行子类化:
窗口
使用故事板时,应用程序必须呈现 故事板通过将其添加到窗口并将该窗口放在屏幕上。 应用程序查询窗口的这个属性。保留的 此属性对窗口的引用对于保持 窗口被释放。如果属性的值为nil( 默认),应用程序创建一个通用实例UIWindow和 将其分配给此属性以供委托参考。你可以 实现此协议的 getter 方法以提供 具有不同窗口的应用程序。
换句话说,在您的 AppDelegate 实现中,只需添加以下 getter
Objective-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 { }
}
【讨论】:
你要先继承 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
}
【讨论】:
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
【讨论】: