2012-03-30 29 views
2

我有一個UIButton我想在其中添加一個存儲在NSArray中的目標動作。我可以使用@selector爲UIButton傳遞一個數組參數嗎?

我想是這樣,

- (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

如果myArray是您要爲選擇使用的NSStrings數組,那麼你可以使用NSSelectorFromString

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

或者,如果你想存儲選擇在NSArray,你要包起來一個NSValue因爲SEL不是一個Objective-C的對象:

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:」),不能是對象本身。

如果要傳遞數組,請將該方法獲得myArray作爲實例變量,該接口文件或.h接口文件或@property中定義的實例變量。

4

您可以存儲選擇的名稱作爲一個字符串,然後創建一個從這些名稱的選擇。例如:

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

如果您想將按鈕對象傳遞給方法,只需在方法名稱(method1:等)之後放置: – user523234 2015-02-19 15:08:39

1

您可以嘗試將選擇器放入數組中。

一個SEL是一個結構,所以你需要將其轉換爲一個NSValue將其存儲在一個數組

[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]; 
相關問題