2015-02-16 5 views
0

Привет У меня есть этот навигационный стек:Как правильно получить самый верхний вид контроллера и брось

NavigationController ->ViewController -> с последующим VCs

В самом верхнем 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 просто пропускает конечный {}, что означает, что как? терпит неудачу, если я прав?

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

NavigationController -> ViewController -> С последующими VCs

С этой навигации стек ваш RootViewController делает не имеет навигацииController, но это 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() 
    }  
} 
+0

Угу .. хорошую работу она работала. Большое спасибо. –

Смежные вопросы