2012-03-30 4 views
2

NSArray에 저장되는 대상 작업을 추가하려는 UIButton이 있습니다.UIButton에 @selector가있는 배열 인수를 전달할 수 있습니까?

내가 좋아하는 뭔가, 내가 그것을 위해 노력하고

- (IBAction) myAction 
{ 
    //Do Something 
} 

//Add myAction to myArray 
[myArray addObject:myAction]; 

//Add target on myButton 
[myButton addTarget:self action:@selector([myArray objectAtIndex:0]) forControlEvents:UIControlEventTouchUpInside]; 

하지만 같은 그 쇼 오류 메시지, Expected IdentifierExpected ]

이 가능 싶어? 이것을 할 수있는 방법이 있습니까?

답변

8

, 당신은 NSSelectorFromString 사용할 수 있습니다 : 당신이 NSArray에서 선택기를 저장하려면,

[myButton addTarget:self action:NSSelectorFromString([myArray objectAtIndex:0]) forControlEvents:UIControlEventTouchUpInside]; 

을 또는, 당신은 그들을 포장해야

NSValue* selCommandA = [NSValue valueWithPointer:@selector(handleCommandA:)]; 
NSValue* selCommandB = [NSValue valueWithPointer:@selector(handleCommandB:)]; 

NSArray *handlers = [NSArray arrayWithObjects:selCommandA, selCommandB, nil ]; 

SEL mySelector = [[handlers objectAtIndex:0] pointerValue]; 
[myButton addTarget:self action:mySelector forControlEvents:UIControlEventTouchUpInside]; 
0

선택기는 객체 또는 클래스 내부의 메소드 이름 (예 : "doSomething:")이며 객체 자체 일 수 없습니다.

배열을 전달하려는 경우 .h 인터페이스 파일 또는 @property에 정의 된 myArray을 인스턴스 변수로 가져옵니다. myArray 당신이 선택기로 사용할 NSStrings의 배열 인 경우

4

당신은 문자열로 선택 이름을 저장 한 후 그 이름에서 선택기를 만들 수 있습니다 NSValueSEL 때문은 오브젝티브 C의 개체가 아닙니다. 예 :

myArray = [NSArray arrayWithObjects:@"method1", @"method2", nil]; 
[myButton addTarget:self action:NSSelectorFromString([myArray objectAtIndex:0]) forControlEvents:UIControlEventTouchUpInside]; 
+0

단추 개체를 메서드에 전달하려면 메서드 이름 (method1 : 등) – user523234

1

대신 선택기를 배열에 넣을 수 있습니다. 당신이 NSValue로 변환 할 필요가 SEL로 값을 변환, 배열

[myArray addObject:[NSValue valueWithBytes:&@selector(myAction) withObjCType:@encode(Selector)]]; 

에 저장합니다 그리고 당신은 단지 배열 오프 NSValue를 얻을 수 있도록

SEL

는 구조체이다 , 그것을 행동으로 사용하십시오.

SEL selector; 
[[myArray objectAtIndex:0] getValue:&selector]; 
[myButton addTarget:self action:selector forControlEvents:UIControlEventTouchUpInside]; 
관련 문제