代码之家  ›  专栏  ›  技术社区  ›  Nate Uni

如何正确获取最顶端的视图控制器并将其投射

  •  0
  • Nate Uni  · 技术社区  · 10 年前

    嗨,我有这个导航堆栈:

    导航控制器--> 视图控制器 -->与后续VC

    在最顶级的VC中,我有一个活动指示器,当用户单击“ 使用Facebook登录 “然后希望在FBRequestConnection的闭包中关闭。FBRequestConnection是异步的,因此需要在闭包中关闭它。

    以下方法不是从LoginVC本身调用的,因此我需要将其从导航堆栈中移除。我尝试过:

    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中的变量窗口看起来似乎一切正常,但if let语句只是跳过了后面的{},这意味着as?如果我是正确的,那就是失败?

    enter image description here

    以下是(不完整)方法:

    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)
            }
        })
    }
    
    1 回复  |  直到 10 年前
        1
  •  1
  •   Zell B.    10 年前

    导航控制器-->视图控制器-->与后续VC

    在此导航堆栈中,rootViewController没有navigationController,但它是navigationController本身,因此 UIApplication.sharedApplication().keyWindow?.rootViewController?.navigationController? 我想是零。尝试将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()
        }       
    }