2010-04-23 13 views
8

मैं वीबी आधारित अनुप्रयोगों को लिखने से बहुत परिचित हूं लेकिन एक्सकोड (और उद्देश्य सी) में नया हूं। मैं वेब पर कई ट्यूटोरियल चला गया हूं और मूल बातें समझता हूं और इंटरफेस बिल्डर इत्यादि से कैसे बातचीत कर सकता हूं। हालांकि, मैं वास्तव में सी भाषा की कुछ बुनियादी अवधारणाओं के साथ संघर्ष कर रहा हूं और आप जो भी मदद कर सकते हैं उसके लिए आभारी होंगे। मेरी समस्या है ...किसी अन्य वर्ग फ़ाइल से फ़ंक्शन को कॉल करने के लिए कैसे करें

मेरे पास एक साधारण आईफोन ऐप है जिसमें एक दृश्य नियंत्रक (फर्स्ट व्यू कंट्रोलर) और संबंधित हेडर और क्लास फाइलों के साथ एक सबव्यू (सेकेंड व्यू कंट्रोलर) है।

FirstViewController.m में एक समारोह में परिभाषित किया

@implementation FirstViewController 

- (void) writeToServer:(const uint8_t *) buf { 
    [oStream write:buf maxLength:strlen((char*)buf)]; 
} 

यह वास्तव में कोई फर्क नहीं पड़ता समारोह है क्या है।

मैं अपने SecondViewController में इस समारोह का उपयोग करना चाहते तो SecondViewController.m में मैं आयात FirstViewController.h

#import "SecondViewController.h" 
#import "FirstViewController.h" 

@implementation SecondViewController 

-(IBAction) SetButton: (id) sender { 
    NSString *s = [@"Fill:" stringByAppendingString: FillLevelValue.text]; 
    NSString *strToSend = [s stringByAppendingString: @":"]; 
    const uint8_t *str = (uint8_t *) [strToSend cStringUsingEncoding:NSASCIIStringEncoding]; 
    FillLevelValue.text = strToSend; 

    [FirstViewController writeToServer:str]; 
} 

यह अंतिम पंक्ति जहां मेरी समस्या है। एक्सकोड मुझे बताता है कि फर्स्ट व्यू कंट्रोलर लिखने के लिए प्रतिक्रिया नहीं दे सकता है। और जब मैं एप्लिकेशन को चलाने का प्रयास करता हूं तो यह फ़ंक्शन कहलाता है तो यह क्रैश हो जाता है।

मुझे लगता है कि मैं पूरी तरह से समझ नहीं पा रहा हूं कि कार्यों को कैसे साझा करना है और अधिक महत्वपूर्ण बात यह है कि कक्षाओं के बीच संबंध।

एक आदर्श दुनिया में मैं अपने कार्यों को रखने और उन्हें आवश्यकतानुसार कॉल करने के लिए एक वैश्विक वर्ग बनाउंगा।

कोई सलाह आभारी रूप से प्राप्त हुई।

- (void) writeToServer:(const uint8_t *) buf; 

अपने FirstViewController.h फ़ाइल में:

+0

आप बेहतर इस्तेमाल प्रतिनिधि –

+0

मैं मतदान किया उर्स यह मेरा उत्तर में वापस लिए भी –

उत्तर

1

आप लिखने के लिए की जरूरत है। यह संकलक के लिए एक संकेत है कि समारोह उस विशेष वर्ग के लिए उपलब्ध है। आपका कोड अभी भी इसके बिना काम करेगा, क्योंकि वास्तविक फ़ंक्शन लागू किया गया है, लेकिन आपको चेतावनी मिलती है क्योंकि संकलक मौजूदा कार्यों के लिए .m फ़ाइल की जांच नहीं करता है जब आप किसी अन्य स्रोत फ़ाइल से हेडर शामिल करते हैं।

31

अपने विधि के deklaration में:

- (void) writeToServer:(const uint8_t *) buf; 

- घोषणा की शुरुआत को इंगित करता है, यह एक पल विधि है कि कम से। इसका मतलब है, आपको इसे कॉल करने के लिए अपनी कक्षा का एक उदाहरण बनाना होगा। यदि कोई + था, तो विधि एक क्लास विधि होगी और आप इसे अपने कोड में जिस तरह से कर सकते हैं उसे कॉल कर सकते हैं।

उदाहरण:

@interface MyClass 
{ } 
- (void) myInstanceMethod; 
+ (void) myClassMethod; 
@end 

फिर कुछ समारोह में:

[MyClass myClassMethod]; // This is ok 

//[MyClass myInstanceMethod]; // this doenst't work, you need an instance: 

MyClass *theInstance = [[MyClass alloc] init]; 
[theInstance myInstanceMethod]; 
0

अगर आप इस केवल घोषित writeToServer वर्ग विधि (संक्षेप में स्थिर पद्धति के रूप में विधि की तरह इस विधि कॉल करना चाहते हैं ...)

कि आप घोषित करने और

+ (void) writeToServer:(const uint8_t *) buf; 

+ (void) writeToServer:(const uint8_t *) buf { 
    [oStream write:buf maxLength:strlen((char*)buf)]; 
} 

की तरह इसे परिभाषित किया है के लिए

फर्क सिर्फ इतना बजाय + संकेत है -

  • संकेत संकेत मिलता है कि विधि वर्ग विधि (स्थिर) है और - संकेत उदाहरण विधि (गैर स्थैतिक)
के लिए है

दूसरा विकल्प FirstViewController के मूल्य बना उदाहरण और कॉल मौजूदा विधि

यानी

FirstViewController FirstViewControllerObj = [[FirstViewController alloc] init]; 
[FirstViewControllerObj writeToServer:str]; 
+0

धन्यवाद प्राप्त करने के लिए आशा है कि जवाब ih एवी ने अब दोनों तरीकों का प्रयास किया लेकिन उनमें से कोई भी काम करने के लिए प्रतीत नहीं होता है, मैं सारांश त्रुटियों नीचे सारांश ViewController सारांश ViewControllerObj = [[सारांश ViewController alloc] init]; त्रुटि: परिवर्तनीय आकार का ऑब्जेक्ट प्रारंभ नहीं किया जा सकता त्रुटि: ऑब्जेक्ट-सी क्लास 'सारांश ViewController' त्रुटि का स्थैतिक रूप से आवंटित उदाहरण: ऑब्जेक्ट-सी क्लास 'सारांश दृश्य नियंत्रक' के नीचे आवंटित आवंटित उदाहरण और नीचे [सारांश दृश्य नियंत्रक ओबीजे लिखने के लिए सर्वर: str]; चेतावनी: 'सारांश ViewController' का जवाब नहीं दे सकता है '-writeToServer:' त्रुटि: सूचक प्रकार में परिवर्तित नहीं हो सकता –

2
  1. अपने FirstViewController.h फ़ाइल में, आप @interface में FirstViewController वस्तु की एक विधि के रूप में writeToServer घोषित करना चाहिए है सेक्शन

    @interface FirstViewController : UIViewController { 
    } 
    
    - (void) writeToServer:(NSString *) str; 
    
    @end 
    
  2. दूसरा, आपके द्वारा भेजा गया संदेश FirstViewControllerwriteToServer एक क्लास विधि नहीं है और FirstViewController कक्षा के तत्कालता से बुलाया जाने वाला केवल वैध है।

    FirstViewController *firstViewCnt = [[FirstViewController alloc] init]; 
    [firstViewCnt writeToServer:str]; 
    [firstViewCnt release]; 
    

या ऐसा ही कुछ।

4

लाइन में:

[FirstViewController writeToServer:str]; 

... आप FirstViewControllerवर्ग को संदेश writeToServer: भेज रहे हैं। इसके बजाय, आपको इसे FirstViewControllerऑब्जेक्ट पर भेजने की आवश्यकता है। इसका मतलब यह है कि आप एक FirstViewController वस्तु के लिए एक संदर्भ प्राप्त और फिर वस्तुwriteToServer: संदेश भेजने के लिए की जरूरत है:,

[firstViewControllerObject writeToServer:str]; 

लेकिन वहाँ iPhone पर एक समय में है, क्योंकि केवल एक ही दृश्य सक्रिय है, तो आप नहीं करना चाहिए FirstViewController और SecondViewController एक ही समय में मौजूद वस्तुओं और एक दूसरे के साथ संवाद कर रहे हैं। इसके बजाय, आपको आवश्यक कक्षा को करने के लिए स्वतंत्र कक्षाएं बनाना चाहिए और सक्रिय दृश्य नियंत्रक इन कक्षाओं के साथ बातचीत कर रहा है।

नोट: "आप वस्तु myObject को संदेश sayHello: भेज रहे हैं" बस कहने का एक और तरीका है विधि "की तरह वस्तु उन्मुख है" आप वस्तु myObject की writeToServer: विधि बुला रहे हैं (ए। " एक समारोह के संस्करण।)

मैं कोको/ऑब्जेक्टिव-सी और object-oriented programming के बारे में अधिक जानने के लिए Cocoa Dev Central पर Learning Objective-C और Learn Cocoa II ट्यूटोरियल पढ़ने की सिफारिश करेंगे।

0

FirstViewController.h

@interface FirstViewController: UIViewController 
- (void)GetItNow; 

FirstViewController.m

- (void)GetItNow{ 
    NSLog(@"I acheived"); } 

    - (IBAction)goToSecondView:(id)sender { 

    SecondViewController* Second= [[SecondViewControlleralloc] initWithNibName:@"SecondViewController" bundle:nil]; 
    rqVC.addId = self.addId; 
    [self.view addSubview:Second.view]; 

} 

SecondViewController.h

@property (nonatomic, assign) id delegate; 

SecondViewController.m

- (IBAction)Action_LoadFunds:(id)sender { 
    [self.view removeFromSuperview]; 
    [_delegate GetItNow]; 

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