Tom*_*ert 42 cocoa-touch uiresponder ios responder-chain
在Mac OS X中,您可以找到第一个响应者:
[[self window] firstResponder]
Run Code Online (Sandbox Code Playgroud)
在iOS中有什么办法吗?或者您是否需要枚举子控件isFirstResponder
并向每个控件发送消息?
Jak*_*ger 234
我真的很喜欢VJK的解决方案,但正如MattDiPasquale所说,它似乎比必要的更复杂.所以我写了这个更简单的版本:
#import "UIResponder+FirstResponder.h"
static __weak id currentFirstResponder;
@implementation UIResponder (FirstResponder)
+(id)currentFirstResponder {
currentFirstResponder = nil;
[[UIApplication sharedApplication] sendAction:@selector(findFirstResponder:) to:nil from:nil forEvent:nil];
return currentFirstResponder;
}
-(void)findFirstResponder:(id)sender {
currentFirstResponder = self;
}
@end
Run Code Online (Sandbox Code Playgroud)
import UIKit
extension UIResponder {
private static weak var _currentFirstResponder: UIResponder?
static var currentFirstResponder: UIResponder? {
_currentFirstResponder = nil
UIApplication.shared.sendAction(#selector(UIResponder.findFirstResponder(_:)), to: nil, from: nil, for: nil)
return _currentFirstResponder
}
@objc func findFirstResponder(_ sender: Any) {
UIResponder._currentFirstResponder = self
}
}
Run Code Online (Sandbox Code Playgroud)
我也把它作为一种类方法,因为它似乎更有意义.您现在可以找到第一个响应者,如下所示:[UIResponder currentFirstResponder]
VJK*_*VJK 26
我写了一个类别UIResponder
来找到第一个响应者
@interface UIResponder (firstResponder)
- (id) currentFirstResponder;
@end
Run Code Online (Sandbox Code Playgroud)
和
#import <objc/runtime.h>
#import "UIResponder+firstResponder.h"
static char const * const aKey = "first";
@implementation UIResponder (firstResponder)
- (id) currentFirstResponder {
[[UIApplication sharedApplication] sendAction:@selector(findFirstResponder:) to:nil from:self forEvent:nil];
id obj = objc_getAssociatedObject (self, aKey);
objc_setAssociatedObject (self, aKey, nil, OBJC_ASSOCIATION_ASSIGN);
return obj;
}
- (void) setCurrentFirstResponder:(id) aResponder {
objc_setAssociatedObject (self, aKey, aResponder, OBJC_ASSOCIATION_ASSIGN);
}
- (void) findFirstResponder:(id) sender {
[sender setCurrentFirstResponder:self];
}
@end
Run Code Online (Sandbox Code Playgroud)
然后在任何来自a的类中,UIResponder
你可以通过调用获得第一个响应者
UIResponder* aFirstResponder = [self currentFirstResponder];
Run Code Online (Sandbox Code Playgroud)
但请记住首先导入UIResponder类别接口文件!
这使用了文档化的API,因此应该没有应用商店拒绝问题.
Eva*_*ski 11
您需要遍历所有子控件并测试该isFirstResponder
属性.当你遇到时TRUE
,突破循环.
UIView *firstResponder;
for (UIView *view in self.view.subviews) //: caused error
{
if (view.isFirstResponder)
{
firstResponder = view;
break;
}
}
Run Code Online (Sandbox Code Playgroud)
更好的解决方案
见雅各布的回答.
Pra*_*les 11
如果您需要第一响应者,您可以要求它重新签署其状态,这是一种让任何人辞职的方法.UIView有一个方法可以遍历所有UIViews子视图,并询问任何第一个响应者辞职.
[[self view] endEditing:YES];
Run Code Online (Sandbox Code Playgroud)
这是Apple的UIView Docs的链接 "此方法查看当前视图及其子视图层次结构,该文本字段是当前第一个响应者.如果找到一个,则要求该文本字段作为第一响应者辞职.参数设置为YES,文本字段永远不会被询问;它被强制辞职."
归档时间: |
|
查看次数: |
28651 次 |
最近记录: |