1. ホーム
  2. オブジェクティブC

[解決済み】プライベートAPIを使用せずに現在のファーストレスポンダーを取得する。

2022-04-17 23:32:19

質問

1週間前にアプリを提出し、今日、恐ろしい拒否のメールが届きました。それは、私が非公開のAPIを使用しているため、私のアプリは受理されないというものです。

あなたのアプリケーションに含まれる非公開APIはfirstResponderです。

さて、問題のAPIコールは、実は私がこのSOで見つけた解決策です。

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

現在のファーストレスポンダーを画面に表示させるには?アプリをリジェクトされない方法を探しています。

どのように解決するのですか?

あるアプリケーションでは、ユーザーが背景をタップした場合、最初のレスポンダが辞任するようにしたいことがよくあります。この目的のために、私はUIViewのカテゴリを書き、私はUIWindow上でそれを呼び出します。

以下はそれに基づいて、最初のレスポンダを返すようにしたものです。

@implementation UIView (FindFirstResponder)
- (id)findFirstResponder
{
    if (self.isFirstResponder) {
        return self;        
    }
    for (UIView *subView in self.subviews) {
        id responder = [subView findFirstResponder];
        if (responder) return responder;
    }
    return nil;
}
@end

iOS 7+

- (id)findFirstResponder
{
    if (self.isFirstResponder) {
        return self;
    }
    for (UIView *subView in self.view.subviews) {
        if ([subView isFirstResponder]) {
            return subView;
        }
    }
    return nil;
}

スウィフト

extension UIView {
    var firstResponder: UIView? {
        guard !isFirstResponder else { return self }

        for subview in subviews {
            if let firstResponder = subview.firstResponder {
                return firstResponder
            }
        }

        return nil
    }
}

Swiftでの使用例です。

if let firstResponder = view.window?.firstResponder {
    // do something with `firstResponder`
}