Swift - 从viewController访问AppDelegate窗口

DCD*_*CDC 23 uiviewcontroller ios appdelegate swift

我在我的应用程序中进行了演练(入门流程),我想要一个跳过按钮.该按钮位于viewController上,因此我发现移动到另一个viewController的最佳方法是访问app delegate窗口.

但是,它一直让我得到一个AppDelegate.Type没有名为"window"的成员的错误.

@IBAction func skipWalkthrough(sender: AnyObject) {
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    AppDelegate.window!.rootViewController = RootViewController   
}
Run Code Online (Sandbox Code Playgroud)

这种方法有什么问题吗?

提前致谢!

Ste*_*tic 49

你有一个错字,它应该appDelegate不是AppDelegate.像这样:

@IBAction func skipWalkthrough(sender: AnyObject) {
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    appDelegate.window!.rootViewController = RootViewController   
}
Run Code Online (Sandbox Code Playgroud)

Swift 3.2

@IBAction func skipWalkthrough(_ sender: AnyObject) {
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        appDelegate.window!.rootViewController = controller
    }
Run Code Online (Sandbox Code Playgroud)


Das*_*oga 18

Swift 3+

let appDelegate = UIApplication.shared.delegate as? AppDelegate
let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)
let homeController = mainStoryboard.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
appDelegate?.window?.rootViewController = homeController
Run Code Online (Sandbox Code Playgroud)

  • 这在 Swift 5+ 中仍然有效吗?我似乎无法让它工作,appDelegate?.window 行会抛出一个错误,指出不能在“any”类型的非可选值上使用可选链接,修复它会产生其他错误。 (2认同)

Ted*_*ery 10

斯威夫特3

这是一种更好的方法:

    if let window = NSApplication.shared().windows.first {
        window.acceptsMouseMovedEvents = true;
    }
Run Code Online (Sandbox Code Playgroud)


Nik*_*ani 10

appDelegate.window!.rootViewController在Swift 5中不工作

这是工作代码

添加以下扩展名

extension UIWindow {
    static var key: UIWindow! {
        if #available(iOS 13, *) {
            return UIApplication.shared.windows.first { $0.isKeyWindow }
        } else {
            return UIApplication.shared.keyWindow
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用

let mainSB = UIStoryboard(name: "Main", bundle: nil)
                    
if let RootVc = mainSB.instantiateViewController(withIdentifier: "NavigationController") as? UINavigationController{
    UIWindow.key.rootViewController = RootVc
}

UIWindow.key // to access only window
Run Code Online (Sandbox Code Playgroud)


Gus*_*cht 5

您还可以使用条件绑定来访问window.

if let window = UIApplication.shared.windows.first {
    // use window here.
}
Run Code Online (Sandbox Code Playgroud)