2010-05-12 20 views
10

我是iPhone新手,我有一個問題,可能有一個非常簡單的答案。我試圖將按鈕添加到視圖中,並且這些按鈕與我定義的自定義類相關聯。當我將這些按鈕添加到視圖中時,我想知道這些按鈕與哪些類相對應。這是因爲當我按下按鈕時,我需要獲得關於類的一些信息,但是消息的接收者是另一個類。我無法找到有關我在網絡上遇到的錯誤的信息。我的問題是,我想創建一個NSMutableDictionary,其中鍵是類型的UIButton *的和值是我的自定義類型:使用UIButton *作爲鍵的NSMutableDictionary - iPhone開發

// create button for unit 
    UIButton* unitButton = [[UIButton alloc] init]; 
    [sourceButtonMap setObject:composite forKey:unitButton]; 

當然,sourceButtonMap在類中定義和初始化在init功能sourceButtonMap = [[NSMutableDictionary alloc] init];

我得到的,當我嘗試添加鍵值對的錯誤是:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[UIButton copyWithZone:]: unrecognized selector sent to instance 0x3931e90'

這是因爲我無法將UIButton *作爲密鑰存儲嗎? 任何人都可以指出爲什麼我得到這個錯誤?謝謝大家,

AA

回答

3

Apple docs

的關鍵是複製(使用 copyWithZone:;密鑰必須符合 的NSCopying協議)。

的UIButton不符合NSCopying協議,所以你不能在NSDictionary中使用它作爲一個重點

+0

這就是我想,讓你對如何解決這個問題的任何建議?給定一個UIButton,我需要獲得按鈕代表的自定義類。如果我不能使用字典,就必須有另一種方法來做到這一點。我無法使用數組,因爲多個UIButton可以引用同一個對象。有沒有辦法給按鈕的代表類的ID?或者類似的東西? – 2010-05-12 16:20:25

16

的一種方式,我發現是使用構建NSValue作爲鍵使用。創建該用途:

[NSValue valueWithNonretainedObject:myButton]

這裏的警告似乎是,如果該按鈕是垃圾收集,該鍵將保存一個無效的引用。

你可以再次獲取參考UIButton的同時通過字典循環,像這樣:

for (NSValue* nsv in myDict) { 
    UIButton* b = (UIButton*)[nsv nonretainedObjectValue]; 
    ... 
} 
+0

我也面臨着同樣的問題。可以讓你詳細說明如何實現這個技巧。我嘗試過這樣做: - 但應用程序崩潰。 \t \t NSDictionary * catPassdict = [NSDictionary dictionary]; \t \t \t \t \t [catPassdict setValue:[NSValue valueWithNonretainedObject:catAppButton] forKey:@「btn」]; – Gypsa 2011-10-13 05:40:01

2

我有一個很棒的技巧這一點。

我把指針指向一個int(因爲這是一個指針),並將其存儲在NSNumber中。使用NSNumber作爲關鍵字解決了這個問題,並且因爲誰在乎在字典中存儲按鈕的副本,所以非常有意義。我更有意義地存儲指針信息的副本。

如果你喜歡我,你可能會將這一點包裝成一個宏。事情是這樣的:

#define BOX_AS_NUM(_ptr_) [NSNumber numberWithInt:(int)_ptr_]

那麼它是一個少許清潔劑在代碼中使用...

NSDictionary* btnMap = [NSDictionary dictionaryWithObjectsAndKeys:some_obj, BOX_AS_NUM(some_btn), nil]; 
-(IBAction)someBtnAction:(id)sender 
{ 
    SomeObj* obj = [btnMap objectForKey:BOX_AS_NUM(sender)]; 
    [obj doCoolStuffBecuaseIWasJustClicked]; 
} 
+1

以及一個很酷的技巧:使用表單中提供的內置標記而不是html標記。 – vikingosegundo 2011-05-15 16:41:17

2

UIButtons有description屬性,可以用來作爲字典鍵:

NSMutableDictionary *myDictionary = [[NSMutableDictionary alloc] initWithCapacity:1]; 
UIButton *myButton = [[UIButton alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 10.0f, 10.0f)]; 
id myObject; 
[myDictionary setObject:myObject forKey:myButton.description]; 

// somewhere else in code 
id myLookedUpObject = [myDictionary objectForKey:myButton.description]; 
// do something with myLookedUpObject 
+0

如果在字典中有多個UIButton用作鍵,是否有一些保證每個UIButton都會爲其描述屬性值具有唯一的不變值? (我試着採用這種方法,並且自己設置description屬性值,但它是隻讀的。) – 2013-06-13 03:15:07

+0

我用這個解決方案與多個UIButton並且工作正常。在我的情況下,不需要自定義描述。 – synthresin 2013-10-16 01:26:12