【问题标题】:whose view is not in the windows heirarchy其视图不在窗口层次结构中
【发布时间】:2017-07-03 16:07:42
【问题描述】:

我知道以前有人问过这个问题,但其他问题中的答案都没有对我有用。这是我的代码:

```

var values = [String: AnyObject]()

func loginUserToFirebase(_ completion: () -> Void) {
    let accessToken = FBSDKAccessToken.current()
    guard let accessTokenString = accessToken?.tokenString else {fatalError()}
    let credentials = FIRFacebookAuthProvider.credential(withAccessToken: accessTokenString)
    FIRAuth.auth()?.signIn(with: credentials, completion: { (user, error) in
        if error != nil {
            print(error ?? "Something went wrong")
            return
        }
        self.fbGraphRequest()
    })
}

internal func fbGraphRequest(){
    FBSDKGraphRequest(graphPath: "/me", parameters: ["fields": "id, name, email"]).start { (connection, result, error) in
        if error != nil {
            print(error ?? "error unknown")
            return
        } else {
            print(result ?? "no result")
            self.values = result as! [String: AnyObject]
            print(self.values)
            weak var rootViewModel = RootViewModel()
            rootViewModel?.values = self.values
            self.presentRootViewController()
        }
    }
}

internal func presentRootViewController() {
    let loginController = LoginController()
    let rootViewController = RootViewController()
        loginController.present(rootViewController, animated: true, 
completion: nil)

}

```

这是我的错误: Attempt to present <Art_Cache.RootViewController: 0x7fa6a1c2aab0> on <Art_Cache.LoginController: 0x7fa6a1c840b0> whose view is not in the window hierarchy! 当我在我的 LoginViewController 中有这个并且我使用 self.present(rootViewController, animation: true, completion: nil) 时,这个 sn-p 起作用了。我试图将我的项目转换为 MVVM,这就是正在发生的事情。问题似乎出在self.presentRootViewController() 周围。这些功能在按下 facebook 登录按钮时触发。请帮助和欢呼!

【问题讨论】:

    标签: mvvm swift3 xcode8 ios10


    【解决方案1】:

    当您当前的视图控制器不是窗口的一部分时会发生这种情况,您可以更改

    func topViewController(_ base: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {
    
            if let nav = base as? UINavigationController {
                return topViewController(nav.visibleViewController)
            }
    
            if let tab = base as? UITabBarController {
                let moreNavigationController = tab.moreNavigationController
    
                if let top = moreNavigationController.topViewController, top.view.window != nil {
                    return topViewController(top)
                } else if let selected = tab.selectedViewController {
                    return topViewController(selected)
                }
            }
    
            if let presented = base?.presentedViewController {
                return topViewController(presented)
            }
    
            return base
        }
    
    
        topViewController()?.present(rootViewController, animated: true, 
        completion: nil)
    

    【讨论】:

    • 谢谢先生。你是摇滚明星!我尝试了此代码的变体,但它没有工作,所以我不认为这是UIApplication.shared.keyWindow.rootViewcontroller 的问题。再次感谢您!
    • 您甚至包括了导航和选项卡选择。你真的是个摇滚明星!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    • 2018-06-27
    • 1970-01-01
    • 2016-09-03
    相关资源
    最近更新 更多