2010-05-12 10 views
10

मैं आईफोन विकास के लिए नया हूं और मेरे पास एक सवाल है जिसका एक बहुत ही सरल जवाब हो सकता है। मैं एक दृश्य में बटन जोड़ने की कोशिश कर रहा हूं और ये बटन एक कस्टम क्लास से जुड़े हैं जो मैंने परिभाषित किया है। जब मैं दृश्य में बटन जोड़ता हूं, तो मैं जानना चाहता हूं कि ये बटन किस वर्ग से मेल खाते हैं। ऐसा इसलिए है क्योंकि जब मैं बटन दबाता हूं, मुझे कक्षा के बारे में कुछ जानकारी प्राप्त करने की आवश्यकता होती है, लेकिन संदेश का प्राप्तकर्ता एक और वर्ग है। मुझे वेब पर मिलने वाली त्रुटि के बारे में जानकारी नहीं मिली। समस्या मेरे पास है कि मैं एक NSMutableDictionary बनाने के लिए जहां चाबियों का प्रकार UIButton * हैं कोशिश कर रहा हूँ और मूल्यों अपने कस्टम प्रकार के होते हैं:UIButton * के साथ एनएसएमयूटेबल डिक्शनरी के रूप में - आईफोन विकास

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

, sourceButtonMap वर्ग में परिभाषित किया गया है और आरंभ नहीं हो जाता के रूप में sourceButtonMap = [[NSMutableDictionary alloc] init];

त्रुटि मैं जब मैं कुंजी-मान पेयर को जोड़ने का प्रयास init समारोह में है:

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

क्या यह हो रहा है क्योंकि मैं UIButton * को चाबियों के रूप में स्टोर नहीं कर सकता? क्या कोई मुझे बता सकता है कि मुझे यह त्रुटि क्यों मिल रही है? आप सभी को धन्यवाद,

उत्तर

3

Apple docs से:

कुंजी कॉपी किया जाता है ( copyWithZone का उपयोग कर :; कुंजी NSCopying प्रोटोकॉल का पालन करना चाहिए)।

UIButton NSCopying प्रोटोकॉल के अनुरूप नहीं है और इसलिए आप NSDictionary में एक महत्वपूर्ण के रूप में उपयोग नहीं कर सकते

+0

है यही कारण है कि मैं क्या सोचा है, तो आप कैसे इस समस्या को हल करने के लिए पर कोई सुझाव है? UIButton को देखते हुए, मुझे उस कस्टम क्लास को प्राप्त करने की आवश्यकता है जो बटन का प्रतिनिधित्व करता है। यदि मैं एक शब्दकोश का उपयोग नहीं कर सकता, तो ऐसा करने का दूसरा तरीका होना चाहिए। मैं एक सरणी का उपयोग नहीं कर सकता क्योंकि कई UIButtons एक ही ऑब्जेक्ट को संदर्भित कर सकते हैं। बटन का प्रतिनिधित्व करने वाले वर्ग की आईडी देने का कोई तरीका है? या कुछ समान है? –

16

एक तरह से मैंने पाया एक NSValue निर्माण कुंजी के रूप में उपयोग करने के लिए इस्तेमाल किया गया। उस उपयोग को बनाने के लिए:

[NSValue valueWithNonretainedObject:myButton]

यहां चेतावनी यह प्रतीत होती है कि यदि बटन कचरा इकट्ठा किया गया है, तो कुंजी एक अमान्य संदर्भ रखेगी।

आप जबकि इतने तरह शब्दकोश के माध्यम से पाशन फिर UIButton के संदर्भ में प्राप्त कर सकते हैं:

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

मुझे भी एक ही समस्या का सामना करना पड़ रहा है। क्या आप इस चाल को कार्यान्वित करने के बारे में विस्तार से बता सकते हैं। मैंने ऐसा करने की कोशिश की: - लेकिन ऐप क्रैश हो रहा है। \t \t NSDictionary * catPassdict = [NSDictionary शब्दकोश]; \t \t \t \t \t [catPassdict setValue: [NSValue valueWithNonretainedObject: catAppButton] forey: @ "btn"]; – Gypsa

2

मैं इस के लिए एक शांत चाल मिल गया है।

मैंने पॉइंटर को एक int में डाला (क्योंकि यह सब एक पॉइंटर वास्तव में है) और इसे एनएसएनंबर में स्टोर करें। एक कुंजी के रूप में 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

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 का उपयोग किया जा रहा है, तो क्या कुछ गारंटी है कि प्रत्येक के पास इसके विवरण संपत्ति मूल्य के लिए अद्वितीय, अपरिवर्तनीय मूल्य होगा? (मैंने इस दृष्टिकोण को लेने और विवरण संपत्ति मूल्य को स्वयं सेट करने का प्रयास किया, लेकिन यह केवल पढ़ने योग्य है।) –

+0

मैंने इस समाधान का उपयोग एकाधिक UIButton के साथ किया और यह ठीक काम करता है। मेरे मामले में, कोई कस्टम विवरण की आवश्यकता नहीं है। – synthresin

संबंधित मुद्दे