获取窗口当前显示的控制器

解决类似网易新闻客户端收到新闻推送后,弹出一个UIAlert,然后跳转到新闻详情页面这种需求

1.提供一个UIView的分类方法,这个方法通过响应者链条获取view所在的控制器

- (UIViewController *)parentController
{
    UIResponder *responder = [self nextResponder];
    while (responder) {
        if ([responder isKindOfClass:[UIViewController class]]) {
            return (UIViewController *)responder;
        }
        responder = [responder nextResponder];
    }
    return nil;
}

2.通过控制器的布局视图可以获取到控制器实例对象

modal的展现方式需要取到控制器的根视图

+ (UIViewController *)currentViewController
{
    UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;
    // modal展现方式的底层视图不同
    // 取到第一层时,取到的是UITransitionView,通过这个view拿不到控制器
    UIView *firstView = [keyWindow.subviews firstObject];
    UIView *secondView = [firstView.subviews firstObject];
    UIViewController *vc = secondView.parentController;
    if ([vc isKindOfClass:[UITabBarController class]]) {
        UITabBarController *tab = (UITabBarController *)vc;
        if ([tab.selectedViewController isKindOfClass:[UINavigationController class]]) {
            UINavigationController *nav = (UINavigationController *)tab.selectedViewController;
            return [nav.viewControllers lastObject];
        } else {
            return tab.selectedViewController;
        }
    } else if ([vc isKindOfClass:[UINavigationController class]]) {
        UINavigationController *nav = (UINavigationController *)vc;
        return [nav.viewControllers lastObject];
    } else {
        return vc;
    }
    return nil;
}
时间: 2024-12-16 14:23:05

获取窗口当前显示的控制器的相关文章

JavaScript特效实例005-控制弹出窗口居中显示

实例005                控制弹出窗口居中显示 实例说明 点击页面上的按钮,弹出窗口,并将窗口居中显示. 技术要点 本例首先应用JavaScript中的window对象的open()方法,打开指定大小的新窗口,然后通过screen对象,获取屏幕分辨率,再根据获取的值通过window对象的moveTo()方法,将新窗口移动到屏幕居中位置. moveTo()方法将窗口移动到指定坐标(x,y)处,其语法格式如下. window.moveTo(x,y) 其中,参数x,y表示窗口移动到的位

获取Storyboard中单独的控制器

最近碰到一个问题,需求如下: 需求:在某个storyboard中有一个单独的控制器VC(没有连线),在storyboard中给此VC随便拖几个控件在上面,同时自定义一个类绑定此VC,问如何获取到此VC并且显示storyboard中此VC设置的界面.如下图: 1,首先要知道是哪个storyboard,先介绍一下storyboard的三个方法: 1> 下面的方法表示通过storyboard的名字从某个包中获取(一般设置为nil表示从主包中获取)storyboard + (UIStoryboard *

Android获取窗口可视区域大小: getWindowVisibleDisplayFrame()

getWindowVisibleDisplayFrame()方法 getWindowVisibleDisplayFrame()是View类下的一个方法,从方法的名字就可以看出,它是用来获取当前窗口可视区域大小的.就是contentParentView +actionbar的高度 此方法的原型为 public void getWindowVisibleDisplayFrame(Rect outRect); 1 它接受一个Rect对象作为参数,执行过程中会根据当前窗口可视区域大小更新outRect的

获取窗口实例句柄

方法一 GetWindowLong(hwnd, GWL_HINSTANCE); 获取该窗口句柄做用的实例句柄? 方法二 WM_CREATE? lpcs = (LPCREATESTRUCT) lParam; lpcs->hInstance;获取窗口实例句柄,布布扣,bubuko.com

【工具】获取窗口与控件信息

[工具]获取窗口与控件信息 常言道,工欲善其事,必先利其器.在脚本中常见的一种操作是操作窗口或控件,在操作之前,首先必须获取目标的各种信息,这时就要用上辅助工具了.本文会介绍一些获取窗口.控件信息的常用工具,这里的先后顺序是随意安排.如果目前用的没什么问题就继续用着,如果对某些地方不满意则可试试其他.简单的截图不容易全面反映整个工具的功能和特色,使用才能获得真实体验. Active Window Info 评论:这个最初来自于 AutoIt3 且安装包中自带的工具,就无需过多介绍了.功能简陋,但

获取Storyboard中的视图控制器

storyboard对于框架的构建是一个非常方便的工具,我们经常需要在storyboard中获取我们指定的视图控制器,那么要怎么获取呢? 方法如下: 第一步:选中视图,为视图自定义一个Storyboard ID 第二步:获取视图

chrome插件:实现任意窗口,显示特定icon

实现任意窗口,显示特定icon /** * 注册标签页更新时的事件 * 这里调用了initialize()事件,把func.js注入当前标签页中 */ chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { if (tab.url.indexOf("Articlestats") > -1) { chrome.pageAction.setIcon({path: "wb.png",t

跨浏览器获取窗口位置

IE.Safari.Opera.Chrome都提供了 screenLeft 和 screenTop属性分别表示窗口相对于屏幕左边和上边的位置. Firefox.Safari.Chrome在 screenX 和 screenY 中提供相同的窗口信息. Opera支持 screenX 和 screenY 属性,但与 screenLeft 和 screenTop 属性并不对应,故不要在Opera中使用 screenX 和 screenY . 使用以下代码可以跨浏览器获取窗口位置: 1 var left

RobotFramework-----第二次执行case时,log窗口未显示数据

第二次执行case时,log窗口未显示数据,如下图 原因:case运行时,是使用IE或是chrome浏览器,运行一次后IEDriverServer.exe或chromedriver.exe进程仍在运行中. 解决方案: 方法一:在任务管理器中,将后IEDriverServer.exe或chromedriver.exe进程结束 方法二: 将下面代码保存为批处理,每次运行后手动运行一下: taskkill /f /im  chromedriver.exe taskkill /f /im  IEDriv