2009-09-28 43 views
0

我有一個函數用一堆UIButton創建一個UIView。傳遞一個選擇器,然後指定參數

每個按鈕都使用參數的字符串調用函數。

所以,在我的功能我做這樣的事情:

[button addTarget: [multiRadio objectAtIndex:0] 
      action: NSSelectorFromString([multiRadio objectAtIndex:1]) 
forControlEvents:UIControlEventTouchUpInside];  

然而,這段代碼沒有指定該動作需要獲得通過字符串參數。

如果我在[multiRadio objectAtIndex:2]中有該字符串參數,我該如何設置按鈕的動作來使用字符串?

回答

1

爲什麼不直接從您調用的方法訪問?取而代之的是:

- (void)someMethod:(id)sender withString:(NSString *)string { 
    [ self doSomethingWithString:string ]; 
} 

使用本:

- (void)someMethod:(id)sender { 
    SomeClass *multiRadio = [[ SomeClass alloc ] init ]; 
    [ self doSomethingWithString:[ multiRadio objectAtIndex:2 ]]; 
    ... 
    [ multiRadio release ]; 
} 

更改方法簽名,必要時,很明顯,但它周圍的一種方式。

+0

要麼重新考慮設計或採取海報建議。 來自http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ActionMessages/Concepts/TargetsAndActions.html#//apple_ref/doc/uid/20000427 一個動作方法只有一個參數:發件人。發送者可以是發送操作消息的NSControl,或者偶爾還可以是目標應該視爲發件人的另一個對象。當它收到一個動作消息時,目標可以向發送者返回消息,請求有關其狀態的附加信息。 – nall 2009-09-28 04:18:02

+0

以及如果他們需要使用現有的'multiRadio',而不是新創建的? – user102008 2011-04-23 01:02:32

0

我會創建一個對象類來充當這些事件的接收者。事情是這樣的:

ActionWrangler *wrangler = [[ActionWrangler alloc] init]; 
wrangler.target = [multiRadio objectAtIndex:0]; 
wrangler.selector = NSSelectorFromString([multiRadio objectAtIndex:1]); 
wrangler.argument = [multiRadio objectAtIndex:2]; 
[button addTarget:wrangler 
      action:@selector(wrangle) 
forControlEvents:UIControlEventTouchUpInside]; 

然後ActionWranger會有像這樣一個爭論方法:

- (void)wrangle 
{ 
    [target performSelector:selector withObject:argument]; 
} 

你最大的問題,那麼將跟蹤ActionWrangler情況下,這樣你就可以釋放他們。

相關問題