辞职当前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
答案 0 :(得分:13)
实际上有一个API可以做到这一点:
[查看endEditing:YES];
答案 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:
调用不在公共标头中的方法绝对是拒绝的理由,所以不要这样做。哦,并且在添加类别时不要忘记使用前缀(如上面的代码所做的那样)以避免冲突。