如何正确获取最顶层的视图控制器并进行投射

How to correctly get the top most view controller and cast it

嗨,我有这个导航堆栈:

NavigationController-->ViewController-->With subsequent VCs

在最顶部 VC,我有一个 activity 指示器,当用户单击“使用 Facebook 登录”时我会打开它,然后想在关闭 FBRequestConnection 时关闭。 FBRequestConnection 是异步的,因此需要在闭包中将其关闭。

以下方法不是从登录VC 本身内部调用的,因此我需要将其从导航堆栈中取出。我试过:

if let loginVC = UIApplication.sharedApplication().keyWindow?.rootViewController?.navigationController?.visibleViewController? as? LoginVC {
                    loginVC.turnOffActivityIndictator()
                }

还有:

if let loginVC = UIApplication.sharedApplication().delegate?.window??.rootViewController as? LoginVC {
                    loginVC.turnOffActivityIndictator()
                }

但它不起作用。我也尝试了其他建议,但无法找到解决方案。我该如何解决这个问题,或者其他人有更好的想法吗?

XCode 中的变量 window 看起来一切正常,但是 if let 语句只是跳过了尾随的 {} 这意味着 as?如果我是正确的,失败了吗?

这是(不完整的)方法:

private class func makeRequestForUserData() -> Void {
    var dict = NSMutableDictionary()
    FBRequestConnection.startForMeWithCompletionHandler({(connection, result, error) -> Void in
        if (error == nil) {
            // Success! Include your code to handle the results here
            let resultDict = result as [String:AnyObject]
            if let usersEmail = resultDict["email"] as? String {
                if DBUser.loginUserForEmail(usersEmail) == true {
                    //Go to main menu
                }else {
                    // no user exists.. alert message
                    // take then to sign up page
                }
            }else{
                // error got nothing from the result dict!!
            }
            if let loginVC = UIApplication.sharedApplication().keyWindow?.rootViewController?.navigationController?.visibleViewController? as? LoginVC {
                loginVC.turnOffActivityIndictator()
            }
        } else {
            // An error occurred, we need to handle the error
            // Check out our error handling guide: https://developers.facebook.com/docs/ios/errors/
            FBErrorHandler.processError(error)
        }
    })
}

NavigationController-->ViewController-->With subsequent VCs

从这个导航堆栈中,您的 rootViewController 没有 navigationController 但它本身就是 navigationController 所以 UIApplication.sharedApplication().keyWindow?.rootViewController?.navigationController? 我认为返回 nil。尝试将 rootViewController 转换为 UINavigationController 然后获取它的 viewControllers,然后获取所需的 viewController

if let viewControllers = (UIApplication.sharedApplication().keyWindow?.rootViewController? as UINavigationController).viewControllers {

    //get first controller in hierarchy    
    if let loginVC = viewControllers[0] as? LoginVC{

        loginVC.turnOffActivityIndictator()
    }       
}