最近需要得知第一響應者 (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。
隨意留個言吧:)~