最近需要得知第一響應者 (First Responder)是哪個元件,可惜iOS SDK並沒有直接取得的Method,網路上有的是Private API解法,若使用的話很大可能送審會「悲劇」,於是乎就有其他替代方法出現⋯⋯
若想體驗看看悲劇的話,可以使用這Private API:P~
UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];
UIView *firstResponder = [keyWindow performSelector:@selector(firstResponder)];
審核人表明:
The non-public API that is included in your application is firstResponder.
Apple 官方只提供了 isFirstResponder 這樣一個屬性讓我們去檢查某個響應者是不是第一而已。如果我們不知道誰會是第一響應者的話,我們要怎麼取得它呢?寫下UIResponder的Category來實現!
/**
Theme: Get First Responder
IDE: Xcode 10
Language: Objective C
Date: 108/05/28
Author: HappyMan
Blog: https://cg2010studio.com/
*/
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
最後我場景需要得知的居然不是一般的UI元件,也真多虧有這個方法,省下我好多嘗試看得到的UI元件:P~
參考:First Responder 教程:如何使用函式快速取得第一響應者?、Is there any way of asking an iOS view which of its children has first responder status?、Using Responders and the Responder Chain to Handle Events、不要已讀不回! iOS 的 Responder Chain、Get the current first responder without using a private API。

隨意留個言吧:)~