2014-12-11 1 views
0

:NSSelectorFromString에 인수 (예 : BOOL)를 전달할 수 있습니까? 대신에 이와 같은 코드를 갖는

switch(levelNumber) { 
    case 1: [Settings unlockLvl1:YES]; break; 
    case 2: [Settings unlockLvl2:YES]; break; 
    case 3: [Settings unlockLvl3:YES]; break; 
    case 4: [Settings unlockLvl4:YES]; break; 
... 
} 

이 같은 NSSelectorFromString를 사용하는 기대했다 : 나는 올바르게 삽입 할 수있는 어느 곳이 있다는 것을 확실하지 않다 그러나

NSString *selectorString = [NSString stringWithFormat:@"unlockLvl%i", levelNumber]; 
SEL s = NSSelectorFromString(selectorString); 
[Settings performSelector:s]; 

(BOOL) 이런 식으로 선택기를 호출 할 때 YES 인수가 필요합니까? 또한 가능한 경우 선택기를 사용하여 호출되는 메서드에 int 인수를 전달할 수 있기를 원합니다.

선택기 문자열에 추가하면 "인식 할 수없는 선택기"예외가 발생하고 작동이 중단됩니다.

[설정 performSelector : s withObject : ???]; 일할 수 있니? 하지만 BOOL 또는 int, required "id"를 허용하지 않습니다.

정확히 동일한 기능을 가진 각 레벨에 대해 여러 개의 코드 블록이 없도록 숫자를 변경하도록 코드를 작성하려고합니다.

도움이 될 것입니다. 가능하지 않다면 다른 방법이 더 있을까요?

답변

1

performSelector:withObject:을 사용할 수 있지만 BOOLNSNumber으로 묶어야합니다. 다음 방법은 NSNumber의 랩을 풀 필요가 있습니다.

BOOL someBool = YES; // or NO 
[Settings performSelector:s withObject:@(someBOOL)]; 

당신의 unlockLvlX 방법의 각

NSNumber 매개 변수를 사용해야합니다

- (void)unlockLvl1:(NSNumber *)theBool { 
    BOOL boolVal = [theBool boolValue]; 
    // do stuff with boolVal as needed 
} 
+0

예 : 원시 방법을 사용하여

BOOL boolArg = YES; NSMethodSignature* signature = [NSMethodSignature signatureWithObjCTypes:"[email protected]:B"]; // or: // NSMethodSignature* signature = [Settings.class methodSignatureForSelector:selector]; NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:signature]; invocation.target = Settings.class; // or class instance invocation.selector = selector; [invocation setArgument:&boolArg atIndex:2]; [invocation invoke]; 

2)! 이 일이 정말 고마워요. int 값의 경우 [NSNumber numberWithInt :를 사용하여 변환 한 다음 intValue를 사용하여 검색] – RanLearns

+0

int 값의 경우 '@ (someIntValue)'를 사용하여 NSNumber를 만들 수 있습니다. – rmaddy

3

는 그 일을 두 가지 방법이 있습니다.

이 부분은 둘 다 일반적입니다 :

NSString *selectorString = [NSString stringWithFormat:@"unlockLvl%i:", levelNumber]; 
SEL selector = NSSelectorFromString(selectorString); 

1) NSInvocation 사용 :

typedef void (*MethodWithBoolArg)(id, SEL, BOOL); 

MethodWithBoolArg method = (MethodWithBoolArg)[Settings.class methodForSelector:selector]; 
if (method != NULL) 
    method(self, selector, YES); 
+0

둘째로,'obj_msgSend'를 직접 사용할 수 있습니다 :'MethodWithBoolArg f = (MethodWithBoolArg) obj_msgSend; f (self, selector, YES); '이것은 기본적으로 컴파일러가하는 것입니다. – newacct