2010-06-15 13 views
5

मैंने बहुत सी चीजों की कोशिश की, फिर भी कोई परिणाम नहीं।UIButton addTarget: action: forControlEvents: परिणाम [NSObject doesNotRecognizeSelector:]

तो मैं है UIViewController का एक उपवर्ग में प्रोग्राम के बनाए गए निम्न बटन:

rightButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    rightButton.frame = CGRectMake(0.0, 0.0, 110.0, 40.0); 
    rightButton.titleLabel.font = [UIFont fontWithName:GAME_FONT_NAME_STRING size:20.0]; 
    [rightButton setTitle:@"MyTitle" forState:UIControlStateNormal]; 
    rightButton.backgroundColor = [UIColor clearColor]; 
    [rightButton setTitleColor:[UIColor greenColor] forState:UIControlStateNormal]; 
    [rightButton setTitleColor:[UIColor blackColor] forState:UIControlStateHighlighted]; 
    [rightButton setBackgroundImage:normalImage forState:UIControlStateNormal]; 
    [rightButton setBackgroundImage:highlightedImage forState:UIControlStateHighlighted]; 
    [rightButton addTarget:self action:@selector(myButton) forControlEvents:UIControlEventTouchUpInside]; 
    [self.view addSubview:rightButton]; 

जहां चयनकर्ता है:

- (void)myButton; 

मैं सब कुछ करने की कोशिश की:

- (void)myButton; 
- (void)myButton:(id)sender; 
- (void)myButton:(id)sender forEvent:(UIEvent *)event; 
- (IBAction)myButton; 
- (IBAction)myButton:(id)sender; 
- (IBAction)myButton:(id)sender forEvent:(UIEvent *)event; 

और संबंधित चयनकर्ता, ज़ाहिर है:

[rightButton addTarget:self action:@selector(myButton) forControlEvents:UIControlEventTouchUpInside]; 
[rightButton addTarget:self action:@selector(myButton:) forControlEvents:UIControlEventTouchUpInside]; 
[rightButton addTarget:self action:@selector(myButton:forEvent:) forControlEvents:UIControlEventTouchUpInside]; 
[rightButton addTarget:self action:@selector(myButton) forControlEvents:UIControlEventTouchUpInside]; 
[rightButton addTarget:self action:@selector(myButton:) forControlEvents:UIControlEventTouchUpInside]; 
[rightButton addTarget:self action:@selector(myButton:forEvent:) forControlEvents:UIControlEventTouchUpInside]; 

परिणाम हमेशा एक अपवाद अपवाद है - [NSObject करता हैNotRecognizeSelector:]। हालांकि, कार्यक्रम का सामान्य बैकट्रैक है:

#0 0x92a6bedb in objc_msgSend() 
#1 0x03b0a430 in ??() 
#2 0x00306b4e in -[UIControl sendAction:to:forEvent:]() 
#3 0x00308d6f in -[UIControl(Internal) _sendActionsForEvents:withEvent:]() 
#4 0x00307abb in -[UIControl touchesEnded:withEvent:]() 
#5 0x002bcddf in -[UIWindow _sendTouchesForEvent:]() 
#6 0x002a67c8 in -[UIApplication sendEvent:]() 
#7 0x002ad061 in _UIApplicationHandleEvent() 
#8 0x02498d59 in PurpleEventCallback() 
#9 0x01cabb80 in CFRunLoopRunSpecific() 
#10 0x01caac48 in CFRunLoopRunInMode() 
#11 0x02497615 in GSEventRunModal() 
#12 0x024976da in GSEventRun() 
#13 0x002adfaf in UIApplicationMain() 

तो उस बटन के साथ समस्या क्या है?

पुनश्च: मैं iPhone SDK 3.1.3


अद्यतन उपयोग कर रहा हूँ!

AppDelegate में निम्न कोड (इंटरफ़ेस में कोई घोषणाओं): पूरी तरह से

- (void)applicationDidFinishLaunching:(UIApplication *)application { 
    UIButton *test = [[UIButton alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 100.0)]; 
    [test setTitle:@"Title" forState:UIControlStateNormal]; 
    UIImage *bg = [UIImage imageNamed:...]; 
    [test setBackgroundImage:bg forState:UIControlStateNormal]; 
    [test addTarget:self action:@selector(testAction) forControlEvents:UIControlEventTouchUpInside]; 
    [window addSubview:test]; 
    [test release]; 
    [window makeKeyAndVisible]; 
} 

- (void)testAction { 
    NSLog(@"Write something..."); 
} 

काम करता है!

लेकिन अगर मैं एक ही कोड के साथ एक खाली UIViewController बनाएँ:

- (void)viewDidLoad { 
    UIButton *test = [[UIButton alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 100.0)]; 
    [test setTitle:@"Title" forState:UIControlStateNormal]; 
    UIImage *bg = [UIImage imageNamed:...]; 
    [test setBackgroundImage:bg forState:UIControlStateNormal]; 
    [test addTarget:self action:@selector(testAction) forControlEvents:UIControlEventTouchUpInside]; 
    [self.view addSubview:test]; 
    [test release]; 
    [window makeKeyAndVisible]; 
} 

- (void)testAction { 
    NSLog(@"Write something..."); 
} 

मैं इस रहस्यमय त्रुटि मिलती है। :-(मदद

उत्तर

8

समाधान!

UIViewController *controller = [[MyCustomController alloc] init]; 
[window addSubview:controller.view]; 
[controller release]; 

तो केवल देखने के नियंत्रक को देखते संपत्ति बनाए रखा गया था और बाकी सब कुछ पर्ज किया गया था:

मेरे समस्या यह है कि मैं AppDelegate में निम्न कोड का इस्तेमाल किया था। व्यू कंट्रोलर में कोई कार्यक्षमता नहीं थी (कोई टच इवेंट नहीं, कोई इंस्टेंस विधियां नहीं)। यही कारण है कि addTarget: action: forEvents: काम नहीं किया।

तो, यह स्मार्ट करें - ऐपडिलेगेट के डेलोक में अपने व्यू कंट्रोलर को छोड़ दें।;)

+0

एआरसी पेश करने के बाद, समाधान थोड़ा अलग है। अब आपको हेडर फ़ाइल में UIViewController * नियंत्रक घोषित करने की आवश्यकता है। तो यह कक्षा का एक सदस्य चर है और यह आंतरिक रूप से बनाए रखा है। बस एआरसी का उपयोग करने के रूप में रिलीज को कॉल न करें जैसा कि आप जानते हैं। –

0

जहां myButton घोषित किया जा रहा है यह संश्लेषित है, तो बजाय

rightButton = [UIButton buttonWithType: UIButtonTypeCustom];!?

उपयोग

self.rightButton = [UIButton buttonWithType:UIButtonTypeCustom]; 

जो काम करना चाहिए। यदि नहीं, तो कृपया यह बताएं कि आप संपत्ति की घोषणा कैसे कर रहे हैं।

+0

मैं नहीं मानता कि इस मुद्दे को यहाँ है। यह दृश्य नियंत्रक प्रोग्रामेटिक रूप से इसका दृश्य बनाता है (बिल्कुल कोई xib फ़ाइल नहीं)। बटन कक्षा में केवल एक आवृत्ति चर (संपत्ति नहीं) है, इसलिए: self.rightButton = ... बिल्कुल संकलित नहीं करता है। मैंने कोड में भी एक बटन बनाया है। UIButton * बटन 2 = [UIButton बटनविथ टाइप: UIButtonTypeCustom]; ... [self.view addSubview: button2]; जब मैं कोई लक्ष्य नहीं जोड़ता और बटन सामान्य रूप से प्रस्तुत करता है और कार्य करता है। जब मैं कार्यक्षमता जोड़ता हूं (addTarget: action: forEvents :) अपवाद को एक क्लिक पर फेंक दिया जाता है। – Teodor

31

एक पुरानी पोस्ट और शायद सब अब के अनुसार क्रमबद्ध लेकिन वहाँ एक और समस्या यह है कि एक दुर्घटना का कारण होगा:

[test addTarget:self action:@selector(testAction) forControlEvents:UIControlEventTouchUpInside] 

सही नहीं है। action:@selector(testAction) एक कॉलन वहाँ इस प्रकार होना चाहिए:

action:@selector(testAction:) 

वरना आप किसी अपरिचित चयनकर्ता दुर्घटना मिलेगा - जो है कि तुम क्या हो रही है ..

+1

मेरी इच्छा है कि मैं आपको इसके लिए +100 वोट दे सकता हूं, आपने मुझे हेडक्रैचिंग के घंटे बचाए हैं। यदि आप कॉलन को आईडी आईडी के बिना चयनकर्ता लक्ष्य को याद करते हैं - लेकिन इसका बहुत उपयोग नहीं है। कोलन जोड़ना जादू करता है। शायद ही कभी मैंने कोड को अस्पष्ट और आसानी से याद किया है – Cruachan

+1

हां --- बस इस में भाग गया --- कि कोलन महत्वपूर्ण है --- धन्यवाद शुक्रिया 66 इस प्रतिक्रिया को लिखें। – David

+0

एक ही समस्या थी। इस बारे में बताने के लिए शुक्रिया! –