使用UIWindow获取visibleViewController?

时间:2017-03-01 08:39:53

标签: ios swift

所以,selfUIWindow,但是如何在当前获取visibleViewController?

5 个答案:

答案 0 :(得分:1)

在swift3:

func getVisibleViewController(_ rootViewController: UIViewController?) -> UIViewController? {

    var rootVC = rootViewController
    if rootVC == nil {
        rootVC = UIApplication.shared.keyWindow?.rootViewController
    }

    if rootVC?.presentedViewController == nil {
        return rootVC
    }

    if let presented = rootVC?.presentedViewController {
        if presented.isKind(of: UINavigationController.self) {
            let navigationController = presented as! UINavigationController
            return navigationController.viewControllers.last!
        }

        if presented.isKind(of: UITabBarController.self) {
            let tabBarController = presented as! UITabBarController
            return tabBarController.selectedViewController!
        }

        return getVisibleViewController(presented)
    }
    return nil
}

答案 1 :(得分:0)

如果添加子视图控制器:

let viewControllersVisible = self.rootViewController?.childViewControllers.filter({ $0.isVisible && $0.view.window })

这将返回在视图层次结构中添加的UIViewControllers数组,它不会说用户是否真的能够看到这些视图控制器,具体取决于您的层次结构。

如果您仅以模态方式呈现视图控制器:

let viewControllerVisible = self.rootViewController?.presentedViewController

答案 2 :(得分:0)

您应该查看此answer。它的要点是你从窗口的.rootViewController开始。在我自己的代码中(使用UINavigationController作为.rootViewController,我使用此代码(在AppDelegate中):

if let nvc = self.window?.rootViewController as? UINavigationController {
    if let mvc = nvc.topViewController as? MasterViewController {
        // ... do something
    } else if let dvc = nvc.topViewController as? DetailViewController {
        // ... do something
    }
}

请注意,如果您使用Master-Detail应用程序的默认模板,则需要考虑插入自身的SplitViewController,但这应该从样板代码中明显地显而易见。

答案 3 :(得分:-1)

为了获得对层次结构中最顶层视图控制器的引用,请尝试以下代码

UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController;

while (topController.presentedViewController)
{
    topController = topController.presentedViewController;
}

return topController;

答案 4 :(得分:-1)

如果你想在窗口的最顶层视图尝试使用它,你将获得视图。

var theWindow = editor.windowManager.open({
  html: '<iframe id="iframeID" src="iframeURL" frameborder="0"></iframe>',
  buttons: [
    {
      text: 'Cancel',
      subtype: 'secondary'

    },
    {
      text: 'Submit',
      onclick: 'submit',
      subtype: 'primary mySubmitButton'
    }
  ],
});

$('#iframeID').on('load', function(){
  selectedSnippets.on('change', function(e){
    theWindow.statusbar.$el.find('.mySubmitButton .mce-txt').text(text);
  });
});