正确(App Store Safe)方式让第一响应者辞职?

时间:2010-01-26 22:14:28

标签: iphone

辞职当前firstResponder的正确方法是什么?

我见过以下内容: 循环遍历字段并在每个字段上调用resignFirstResponder。

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

这看起来像是在调用一个私有函数,这个app store是安全的吗?:

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

有更好的方法吗?

谢谢!

评论: 看起来第二种方法是使用私有API并且某人的应用因此被拒绝:link

4 个答案:

答案 0 :(得分:13)

答案 1 :(得分:3)

看一下这个问题:How do I [legally] get the current first responder on the screen on an iPhone?

我对这个问题的回答应该适合你的情况。

答案 2 :(得分: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];

答案 3 :(得分:0)

我的建议是实施一个hacky&慢速版本的firstResponder自己在一个类别中然后提交雷达请求他们添加方法。这些方面的东西:

- (id)my_FirstResponder
    for view in [self subviews]
        if [self isFirstResponder]
            return self
        return [self my_firstResponder]
    return nil

使用performSelector:调用不在公共标头中的方法绝对是拒绝的理由,所以不要这样做。哦,并且在添加类别时不要忘记使用前缀(如上面的代码所做的那样)以避免冲突。