"선택기 배열"을 만드는 방법


82

저는 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;
}

답변:


79

문자열을 저장하고 NSSelectorFromString을 사용할 수 있습니까?

로부터 문서

NSSelectorFromString

주어진 이름을 가진 선택자를 반환합니다.

SEL NSSelectorFromString (
   NSString *aSelectorName
);

2
선택기 배열 만 필요한 경우에는 적절한 솔루션이 아닙니다.
Aleks N.

1
NSPointerArray더 나은.
DawnSong

43

그러면 선택기에서 개체가 생성됩니다.

[NSValue valueWithPointer:@selector(x)]

2
여기에서 사용할 선택자를 어떻게 추출 performSelector:하시겠습니까?
Dean Kelly

3
@DeanKelly 여기에 대답 stackoverflow.com/questions/575055/... 테리 franguiadakis에 의해
ABCD.ca

1
다음과 같이 타입 캐스트가 필요합니다.SEL x = (SEL)selectorValue.pointerValue;
DawnSong

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
좋지만 static여기에서는 필요하지 않습니다 (초기화 프로그램은 컴파일 시간 상수가 아닙니다).
Aleks N.

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

NSInvocation은 너무 비쌉니다.
DawnSong

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클래스에도 메서드를 추가하고 여기에서 메서드 호출을 구현할 수 있습니다.


1

선택자를 배열에 저장하는 두 가지 방법을 보완하고 싶습니다.

첫째, NSPointerArray같은 불투명 한 포인터를 저장할 수 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];

원하는대로 선택하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.