IT TIP

가장 높은 UIViewController 얻기

itqueen 2021. 1. 6. 20:36
반응형

가장 높은 UIViewController 얻기


뷰 컨트롤러를 푸시하고 / 또는에 모달 뷰 컨트롤러를 표시하는 UINavigationController경우 가장 높은 것이 무엇인지 어떻게 알 수 UIViewController있습니까? 또는 제 경우에는 특정 UITableViewController이 가장 높은지 아닌지 알고 싶습니다 .

나는 사용해 보았다 :

self.navigationController.topViewController == self

...하지만 이것은 작동하지 않습니다. 나는 그 위에 모달 뷰 컨트롤러를 제시 topViewController하고 있고 UINavigationController(모달로 제시된 뷰와는 반대로) 어떤 뷰가 푸시되었는지를 추적 하기 때문에 실패한다고 생각합니다 .


원하는 visibleViewController:

현재 표시되는 뷰는 탐색 스택의 맨 위에있는 뷰 컨트롤러 또는 모달로 제공된 뷰 컨트롤러에 속할 수 있습니다.


NSArray *viewContrlls=[[self navigationController] viewControllers];

[viewContrlls lastObject];

질문이 오래되었다는 것을 알고 있지만 여전히 인기가 있습니다. 그래서 다른 UIViewController's하위 클래스 를 처리하는 최고의 솔루션을 게시하고 싶습니다 . 동시에 사이드 메뉴와 같은 사용자 지정 "컬렉션"컨트롤러를 통해이 메서드의 기능을 확장 할 수 있습니다.

extension UIWindow {

  var visibleViewController: UIViewController? {
    guard let rootViewController = rootViewController else {
      return nil
    }
    return visibleViewController(for: rootViewController)
  }

  private func visibleViewController(for controller: UIViewController) -> UIViewController {
    var nextOnStackViewController: UIViewController? = nil
    if let presented = controller.presentedViewController {
      nextOnStackViewController = presented
    } else if let navigationController = controller as? UINavigationController,
      let visible = navigationController.visibleViewController {
      nextOnStackViewController = visible
    } else if let tabBarController = controller as? UITabBarController,
      let visible = (tabBarController.selectedViewController ??
        tabBarController.presentedViewController) {
      nextOnStackViewController = visible
    }

    if let nextOnStackViewController = nextOnStackViewController {
      return visibleViewController(for: nextOnStackViewController)
    } else {
      return controller
    }
  }

}

참조 URL : https://stackoverflow.com/questions/4067692/getting-the-top-most-uiviewcontroller

반응형