Just My Life & My Work

最近需要得知第一響應者 (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 ChainGet the current first responder without using a private API

廣告

隨意留個言吧:)~

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

標籤雲

%d 位部落客按了讚: