2010-01-25 48 views
6

我正在編寫一些Objective-C代碼,而且我經常遇到必須使用類變量來存儲一次性值的情況。消耗後,我不再需要它。對我而言,將此值存儲在類變量中看起來像代碼味道。真的值應該作爲參數傳遞給我使用的方法。如何從Objective-C代碼中刪除一次性使用的類變量?

我在使用代理時會遇到這種情況。作爲一個例子,我有一個用戶界面,其中包含多個用於加載和顯示UIActionSheet的按鈕。該操作表包含日期選擇器,該操作表在操作表被解除時設置UILabel的值。

- (IBAction)setPurchaseDateTapped { 
    self.activeField = purchaseDate; 
    [self loadDatePickerActionSheet:@"Edit Purchase Date"]; 
} 

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { 
    self.activeField.text = value_from_UIActionSheet; 
} 

正如你可以在這裏看到,該actionSheet clickedButtonAtIndex回調不允許我打發activeField所以我必須用一個類變量。這似乎更正確的寫:

- (void)actionSheet:(UIActionSheet *)actionSheet parameterValue:(id)parameter { 
    parameter.text = value_from_UIActionSheet; 
} 

我相信,我可以子類UIActionSheet和U​​IActionSheet委託並補充一點,我需要簽名,但同樣這似乎是更多的努力比它的價值(?)。

所以我的問題是什麼是做我想做的最好的方法是什麼?

我不一定要更改我創建的日期選取器/操作表界面(雖然如果有更好的模式在UIView上設置多個日期並保持DatePicker不變, 。所有m耳)

回答

3

在這種情況下,我覺得UIActionSheet一個簡單的子類將是要走的路:

@interface SpecialActionSheet : UIActionSheet 
{ 
    id parameter; 
} 
@property (assign) id parameter; 
@end 

@implementation SpecialActionSheet 
@synthesize parameter; 
@end 

這應該是足夠的,因爲所有你想要做的是已在actionSheet保持一個參數。現在,你的代碼可能如下:

- (void)loadDatePickerActionSheet:(NSString *)caption forField:(UITextField *)field { 
    //... 
    datePickerActionSheet.parameter = field; 
} 

- (IBAction)setPurchaseDateTapped { 
    [self loadDatePickerActionSheet:@"Edit Purchase Date" forField:purchaseDate]; 
} 

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { 
    UITextField * field = ((SpecialActionSheet *)actionSheet).parameter; 
    field.text = value_from_UIActionSheet; 
} 
2

我在這些情況下,通常的做法是使用上UIAlertViews標籤屬性,就可以做一個開關(它是一個整數)。它不像有一個字符串或某些東西可以傳遞,但如果你有多個警報,這是一個消除歧義的簡單方法。例如:

... 
actionSheet.tag = [fields indexOfObject: self.activeField]; 
...  //fields is an NSArray of all the field objects I might have on the screen 


- (void)actionSheet:(UIActionSheet *)actionSheet parameterValue:(id)parameter { 
    [[field objectAtIndex: actionSheet.tag] setText: value_from_UIActionSheet]; 
} 
+0

我還沒有意識到tags屬性。我得看看這個。 – 2010-01-25 17:38:27

2

另一個解決方案是use associative storage.

UIActionSheet可能已經擁有了它。你可以通過測試

[myActionSheet setValue:@"test value" forKey:@"testKey]; 
NSLog(@"%@",[myActionSheet valueForKey:@"testKey]; 

如果不過度使用聯想存儲是非常漂亮的。