Xcode 11 beta:AppDelegate 文件没有窗口全局变量
Posted
技术标签:
【中文标题】Xcode 11 beta:AppDelegate 文件没有窗口全局变量【英文标题】:Xcode 11 beta: AppDelegate file doesn't have window global variable 【发布时间】:2019-06-15 14:02:49 【问题描述】:我在 Xcode 11 测试版中遇到问题。
问题是我没有在AppDelegate
文件中声明默认的window
变量。
有人遇到同样的问题吗?
【问题讨论】:
这给您带来了什么问题? 我使用的是 Xcode 11 beta,只是我创建了单视图应用程序。在 AppDelegate 文件中没有对象调用窗口。而我们在以前的 Xcode 版本中就有它。 再说一次,这给您带来了什么问题? 我想使用 window 变量来设置 rootViewController。这有意义吗?UIApplicationDelegate
已经定义了 window
属性。 UIApplication.shared.delegate?.window
.
【参考方案1】:
在 Xcode 11 中,这现在在 SceneDelegate 中完成
编辑:如果您仍然支持 ios 12 或更早版本(或想要支持 13 及之前版本)
将UIWindowSceneDelegate
添加到ApplicationDelegate
添加:var window:UIWindow?
然后按照您在didFinishLaunching
中的设置进行操作
【讨论】:
是的,但是如果您的新项目的目标是 iOS11 或 iOS12 怎么办?那么该行需要在AppDelegate
中。
你找到解决办法了吗?【参考方案2】:
默认的 var 窗口:UIWindow?现在在 SceneDelegate.swift 中移动。要在 Xcode 11 中设置 rootViewController,您可以在 SceneDelegate.swift 文件中工作,在场景委托中,您必须创建窗口实例和根视图控制器,如下所示:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)
// set or create your viewController here
let yourViewController = UIStoryboard.init(name: "Main", bundle: nil).instantiateViewController(identifier: "yourViewController") as! YourViewController
// set the rootViewController here using window instance
self.window?.rootViewController = yourViewController
这个答案也很有帮助:Why is manually setup root view controller showing black screen?
希望对你有帮助!
【讨论】:
这个函数写的时候只能在iOS 13中使用【参考方案3】:我的做法:
首先,在 AppDelegate 中使用您要访问的视图控制器的类创建一个静态属性,如下所示
class AppDelegate: UIResponder, UIApplicationDelegate
// MARK: Home
static var homeViewController: HomeViewController?
...
然后,在视图控制器中
// MARK: - Managing the view
override func viewDidLoad()
super.viewDidLoad()
// Singleton
AppDelegate.homeViewController = self
...
使用方法:
extension UIViewController
var homeViewController: HomeViewController?
if let controller = self as? HomeViewController
return controller
return AppDelegate.homeViewController
【讨论】:
【参考方案4】:就我而言,仅此而已。
var window: UIWindow? // add this by yourself
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool
window = UIWindow(frame: Device.bounds)
let root = DDTabBarController()
window?.rootViewController = root
window?.makeKeyAndVisible()
return true
【讨论】:
以上是关于Xcode 11 beta:AppDelegate 文件没有窗口全局变量的主要内容,如果未能解决你的问题,请参考以下文章
XCODE 11 - 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[AppDelegate 窗口]:
在 Xcode 11.5 中从 AppDelegate 访问 ViewController(firebase google 登录)
Xcode11 - UIButton 等控件高度为 48,仅在 XR/XSMAX 设备中的 AppDelegate 中
iOS-Xcode11: 删除默认Main.storyBoard, 自定义UIWindow不能在AppDelegate中处理,新增SceneDelegate代理
为啥 Xcode 在 appdelegate.h 文件中使用 AVAudioPlayer Delegate 协议时显示警告?