如何查找当前的第一响应者

有时候总是有需求来获取当前的第一响应者,例如让TextField收键盘,隐藏视图等等操作都需要获取当前的第一响应者,那么该如何获取呢?

UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];  
UIView *firstResponder = [keyWindow performSelector:@selector(firstResponder)];  
  
NSLog(@"%@",firstResponder); 

注意:这个方法虽然简单,但是调用了私有API在平时调试的时候可以使用这种方法,但是打包上线的时候需要把该方法屏蔽掉,不然极有可能被打回。

下面介绍下现在公认比较好的一种方法:
建立分类UIResponder+FirstResponder

//  
//  UIResponder+FirstResponder.h  
//  BobcareDoctorApp  
//  
//  Created by Japho on 16/3/23.  
//  Copyright © 2016年 com.01wisdom. All rights reserved.  
//  
  
#import <UIKit/UIKit.h>  
  
@interface UIResponder (FirstResponder)  
  
+ (id)currentFirstResponder;  
  
@end  
//  
//  UIResponder+FirstResponder.m  
//  BobcareDoctorApp  
//  
//  Created by Japho on 16/3/23.  
//  Copyright © 2016年 com.01wisdom. All rights reserved.  
//  
  
#import "UIResponder+FirstResponder.h"  
  
static __weak id currentFirstResponder;  
  
@implementation UIResponder (FirstResponder)  
  
+ (id)currentFirstResponder {  
    currentFirstResponder = nil;  
    [[UIApplication sharedApplication] sendAction:@selector(findFirstResponder:) to:nil from:nil forEvent:nil];  
    return currentFirstResponder;  
}  
  
- (void)findFirstResponder:(id)sender {  
    currentFirstResponder = self;  
}  
  
@end  
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 好奇触摸事件是如何从屏幕转移到APP内的?困惑于Cell怎么突然不能点击了?纠结于如何实现这个奇葩响应需求?亦或是...
    Lotheve阅读 58,737评论 51 604
  • Core Animation基础 Core Animation 利用了硬件加速和架构上的优化来实现快速渲染和实时动...
    独木舟的木阅读 5,450评论 0 3
  • 事件传递:响应者链 当你设计一个app的时候,你很可能需要你的app能够动态响应某些事件。比如,触摸可以发生在屏幕...
    hjfrun阅读 4,638评论 1 5
  • 什么是事件? iOS中事件分为3大类 : 触摸事件, 加速计事件和远程控制事件.当你的手指在手机屏幕上触摸时, 产...
    iYeso阅读 1,209评论 0 1
  • 1.OC里用到集合类是什么? 基本类型为:NSArray,NSSet以及NSDictionary 可变类型为:NS...
    轻皱眉头浅忧思阅读 5,183评论 0 3