我正在使用iPhone SDK(3.0),我正在尝试创建一个选择器数组来调用一个类中的各种方法。
显然,我做错了(我认为@selector不被认为是一个类,因此将它们填充到NSArray中是行不通的。)
我尝试了这个,但这显然是错的。
是否有一种简单的方法来拥有这样的选择器数组?或者有更好的方法来迭代一组方法吗?
selectors = [NSArray arrayWithObjects:
@selector(method1),
@selector(method2),
@selector(method3),
@selector(method4),
@selector(method5),
@selector(method6),
@selector(method7), nil];
for (int i = 0; i < [selectors count]; i++) {
if ([self performSelector:[selectors objectAtIndex:i]]) // do stuff;
}
答案 0 :(得分:80)
你能存储字符串并使用NSSelectorFromString吗?
来自docs
NSSelectorFromString
返回具有给定名称的选择器。
SEL NSSelectorFromString (
NSString *aSelectorName
);
答案 1 :(得分:40)
这会从选择器中创建一个对象:
[NSValue valueWithPointer:@selector(x)]
答案 2 :(得分:35)
为什么不使用简单的C数组?
static const SEL selectors[] = {@selector(method1),
....
@selector(method7)};
...
for (int i = 0; i < sizeof(selectors)/sizeof(selectors[0]); i++) {
[self performSelector:selectors[i]];
// ....
}
答案 3 :(得分:12)
您还可以创建NSInvocation
的数组。如果你需要一个参数来选择你的选择器,这很方便。
NSMethodSignature *sig = [[yourTarget class] instanceMethodSignatureForSelector:yourSEL];
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:sig];
[inv setTarget:yourTarget];
[inv setSelector:yourSEL];
[inv setArgument:&yourObject atIndex:2]; // Address of your object
答案 4 :(得分:1)
如果列表是静态的,我会选择KennyTM的解决方案,但是如果你需要动态数组或集合,除了存储选择器字符串之外,另一个选项是创建一个具有SEL
属性的对象或ivar,存储它。
@interface SelectorObject : NSObject
@property (assign, readonly, nonatomic) SEL selector;
- (id)initWithSelector:(SEL)selector;
@end
@implementation SelectorObject
- (id)initWithSelector:(SEL)selector {
self = [super init];
if (self) {
_selector = selector;
}
return self;
}
@end
然后,您可以在类中添加perform
方法,并在那里实现方法调用。
答案 5 :(得分:1)
我想补充两种将选择器存储在数组中的方法,
首先,NSPointerArray
可以存储Apple doc所说的不透明指针,例如SEL
,
NSPointerArray *selectors = [[NSPointerArray alloc] initWithOptions: NSPointerFunctionsOpaqueMemory];
[selectors addPointer:@selector(onSendButton:)];
[button addTarget: self action:[selectors pointerAt:0] forControlEvents:UIControlEventTouchUpInside];
第二个C样式的数组要简单得多,
SEL selectors[] = { @selector(onSendButton:) };
[button addTarget: self action:selectors[0] forControlEvents:UIControlEventTouchUpInside];
任意选择。