一个多星期前,我提交了我的应用程序,今天收到了可怕的拒绝电子邮件。它告诉我我的应用无法接受,因为我使用的是非公开API;具体说,



现在,有问题的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`
}

关于objective-c - 在不使用私有(private)API的情况下获取当前的第一响应者,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1823317/

10-10 20:51