2012-07-27 71 views
3

我創建了一個動作如何通過3個參數@selector

-(void) ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event 

這就像這樣:

self.moveAction = [CCSequence actions:       
        [CCMoveTo actionWithDuration:moveDuration position:touchLocation], 
        [CCCallFunc actionWithTarget:self selector:@selector(guyMoveEnded)], 
        nil 
        ]; 

,但現在,我想@selector爲自動調用下面的方法:

-(void)guyMoveEnded:(BOOL)flag AndWhere:(CGPoint)where Andtime:(float)time{ 
    //do something... 
} 

我該怎麼辦? 請幫助我,我對選擇器感到困惑。

感謝名單!

回答

10

你可以添加參數到一個NSArray,然後把它作爲參數傳遞給您的選擇:

NSArray *params = [NSArray arrayWithObjects:@"a str", [NSNumber numberWithInt:42],myObj]; 
[self performSelector:@selector(myMethod:)withObject:params]; 

然後解壓在你的方法的參數:

-(void)myMethode:(NSArray*)params 
{ 
    NSString *strArg = [params objectAtIndex:0]; 
    NSNumber * numVal = [params objectAtIndex:1]; 
    NSObject *objArg = [params objectAtIndex:2]; 
    int intArg = [numVal intValue]; 
    . 
    . 
    . 
} 
+1

這是最簡單的方法,更難的方式涉及NSInvocation。 +1 – borrrden 2012-07-27 07:32:56

+0

我不知道該如何謝謝你,你真是太好了! – smileVann 2012-07-27 07:45:49

+0

我的榮幸:-) – EsbenB 2012-07-27 07:50:55

3

Apple suggests使用NSInvocation時你需要傳遞兩個以上的參數。 這裏有一個很好的例子:NSInvocation for Dummies?

從這個答案沒有解釋一個簡短的概要:

// Prepare the object 
NSMethodSignature * mySignature = [NSMutableArray 
    instanceMethodSignatureForSelector:@selector(addObject:)]; 
NSInvocation * myInvocation = [NSInvocation 
    invocationWithMethodSignature:mySignature]; 

// Set selector and object 
[myInvocation setTarget:myArray]; 
[myInvocation setSelector:@selector(addObject:)]; 

// Set arguments 
[myInvocation setArgument:&myString atIndex:2]; 

// Invoke it 
[myInvocation invoke]; 

這不僅僅是調用帶有performSelector:選擇多了很多代碼,但是允許你打電話與方法任何數量的參數。正如Cipramill所建議的那樣,如果您無法更改簽名以減少參數計數,這一點尤其有用。

+0

非常感謝,我會檢查它 – smileVann 2012-07-27 07:57:30

+0

@coverback我認爲你的意思是「超過兩個參數」或「3個參數或更多」 – 2012-07-27 08:07:57

+0

... unles有一個'-performSelector:withObject:withObject:withObject:'我不知道:) – 2012-07-27 08:08:48

1

使用您的參數準備一個NSDictionary對象&將該字典傳遞給您的選擇器&您可以從Dictionary中獲取方法內的值。以下僅供參考:

"NSDictionary *dictionary = nil; 
    BOOL flag = YES; 
    CGFloat time; 
    CGPoint pt; 
[dictionary setValue:flag forKey:FIRSTPARAM]; 
    [dictionary setValue:time forKey:SECONDPARAM]; 
    [dictionary setObject:point forKey:THIRDPARAM]; 
[self performSelector:@selector(methodName:) withObject:dictionary]; 

" 

要麼您可以創建您的自定義類傳遞該類的對象。

+0

你的答案是最詳細的,非常感謝,我會嘗試。 – smileVann 2012-07-27 07:59:59

+1

在我看來,使用字典比數組更好,因爲每個對象都可以有意義地(通過其關鍵字)「命名」。當然,你可以使用一個具有有意義名稱的'enum'作爲數組的索引... – 2012-07-27 08:06:49

-1
[favProductCell.btnAddtoCart addTarget:self action:@selector(arrayForAddToCart:) forControlEvents:UIControlEventTouchUpInside]; 

[favProductCell.btnAddtoCart setTag:indexPath.row]; 

-(void)arrayForAddToCart:(id)sender 
{ 
    if (![self.addToCartProductIdArray containsObject:self.favoriteProductArray[[sender tag]]]) 
     [self.addToCartProductIdArray addObject:self.favoriteProductArray[[sender tag]]]; 
}