如何正确获取最顶层的视图控制器并进行投射
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()
}
}
嗨,我有这个导航堆栈:
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()
}
}