正确(App Store 安全)的退出第一响应者的方法是什么?

3

如何正确地取消当前的第一响应者?

我看到过以下几种方法: 循环遍历字段并在每个字段上调用resignFirstResponder。

[[self textFieldForRow:0] resignFirstResponder];
[[self textFieldForRow:1] resignFirstResponder];
[[self textFieldForRow:2] resignFirstResponder];
[[self textFieldForRow:3] resignFirstResponder];

看起来像是调用私有函数,这个应用商店安全吗?

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

有更好的方法吗?

谢谢!

评论: 看起来第二种方法使用了私有API,因此有人的应用程序因此被拒绝: 链接

4个回答


3

0

你上面的代码没有调用任何私有函数。发生的情况是:

 //Gets the application window
 UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];
 //Gets the first Responder View for the window
UIView   *firstResponder = [keyWindow performSelector:@selector(firstResponder)];  
//Make the UView resign the first responder 
[firstResponder resignFirstResponder];     

这些都是公共函数,就我所知,您不会在应用商店遇到任何问题。

另外,有没有更好的方法来做什么?如果您想获取作为 keyWindow 的第一响应者的 UIView,您可以在创建 UIView 时执行:

myView.tag = 100;

并获取它:

UIView *firstResponder = [self viewWithTag:100];

我在UIWindow文档中没有看到“firstResponder”被定义为属性或方法? - Hua-Ying
UIWindow->UIView->UIResponder->isFirstResponder(这是导致该方法的继承链)。不要忘记查看超类方法... - Kendall Helmstetter Gelner
你是正确的,UIWindow文档中没有将其定义为方法,但它在UIResponder(继承)中被定义了。 - Oscar Gomez
isFirstResponder 是一个 BOOL 类型的方法,而 firstResponder 则完全不同且不是一个 BOOL 类型。在 UIWindow.h 头文件中有一个名为 firstResponder 的变量,但它被定义为私有变量:UIResponder *_firstResponder; - Hua-Ying
这段代码对你来说真的起作用吗?我在想可能firstResponder只是一个自定义方法。我只看到在UIWindow.h文件中声明了该变量,但没有访问器。 - Oscar Gomez
是的,它能够工作,但这并不意味着它能够通过应用商店的审批流程。以 _ 开头的变量通常表示为私有变量,不应该在类之外使用。 - Hua-Ying

0
我的建议是自己在一个分类中实现一个hacky和慢速版本的firstResponder,然后提交一个报告请求他们添加这个方法。可以参考以下示例:
- (id)my_FirstResponder
    for view in [self subviews]
        if [self isFirstResponder]
            return self
        return [self my_firstResponder]
    return nil

使用performSelector:调用不在公共头文件中的方法肯定会导致被拒绝,所以不要这么做。哦,别忘了在添加类别时使用前缀(就像上面的代码所做的那样)以避免冲突。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接