2009-04-28 7 views
14

हाय मैं एक ViewController.h में निम्नलिखित कोड मिल गया है के लिए डिफ़ॉल्ट मान सेट करने के लिए:ऑब्जेक्टिव-सी Iphone कैसे एक संपत्ति

#import <UIKit/UIKit.h> 

@interface CalcViewController : UIViewController { 
    NSNumber* result; 
    NSString* input; 
    //NSString* input = @""; 

    IBOutlet UITextField* display; 
} 

@property (retain) NSNumber* result; 
@property (retain) NSString* input; 
@property (nonatomic, retain) UITextField* display; 

@end 

समस्या यह है कि मैं इनपुट के लिए एक स्ट्रिंग संलग्न करना चाहते हैं, लेकिन यह है यह अभी भी शून्य नहीं है जब यह अभी भी शून्य है। Thats क्यों मैं इनपुट के डिफ़ॉल्ट मान को @ "" सेट करना चाहता हूं। लेकिन मैं यह कोड कहां रखूं।

मुझे एक संभावित समाधान के बारे में पता है जहां आप इसे एक डिफ़ॉल्ट कन्स्ट्रक्टर में डालते हैं। लेकिन मुझे यह नहीं पता कि फाइल को किस फाइल में रखा जाए। और जहां मुझे इसे कॉल करना चाहिए।

दुर्भाग्यवश मुझे केवल सी की सीमित समझ मिली और मुझे पता चला कि शायद .h फ़ाइल सही जगह नहीं है।

यदि आपको इसकी आवश्यकता हो तो प्रोजेक्ट प्रकार एक व्यू-आधारित-एप्लिकेशन है।

आशा है कि आप मदद कर सकते हैं।

उत्तर

16

आप उद्देश्य-सी या कोको पर कुछ दस्तावेज पढ़ने के लिए उपयोगी पा सकते हैं। यदि आप StackOverflow या Google पर यहां कोई खोज करते हैं तो शायद आप सामग्री पढ़ने पर कुछ अच्छे सुझाव पा सकते हैं।

अपने प्रश्न का उत्तर देने के लिए, आपके पास CalcViewController का एक @ पूरक होना चाहिए। एक अक्सर * .m फ़ाइल के अंदर इस @ कार्यान्वयन को रखता है। यदि आपकी * .h फ़ाइल को "ViewController.h" नाम दिया गया है तो कार्यान्वयन "ViewController.m" में जाएगा।

फिर आप UIViewController के प्रारंभिक फ़ंक्शन की एक प्रति बनायेंगे और उसे वहां रखें (मुझे नहीं पता कि डिफ़ॉल्ट init फ़ंक्शन क्या है)।

उदाहरण के लिए:

@implementation CalcViewController 

@synthesize result; 
@synthesize input; 

- (id)initWithNibName:(NSString*)aNibName bundle:(NSBundle*)aBundle 
{ 
    self = [super initWithNibName:aNibName bundle:aBundle]; // The UIViewController's version of init 
    if (self) { 
     input = [[NSString alloc] initWithString:@""]; // You should create a new string as you'll want to release this in your dealloc 
    } 
    return self; 
} 

- (void)dealloc 
{ 
    [input release]; 
    [super dealloc]; 
} 
@end // end of the @implementation of CalcViewController 

नोट:

  • आप CalcViewController लिए फ़ाइल का नाम बदलने के लिए कर सकते हैं। मेरा मानना ​​है कि एक्सकोड के रिफैक्टरिंग इंजन से निपटने के लिए यह आसान है।
  • आपको इंटरफ़ेस बिल्डर के साथ कनेक्ट करते समय प्रदर्शन आवृत्ति चर के लिए @property घोषित करने की आवश्यकता नहीं है। जब तक आप चाहते हैं CalcViewController के ग्राहकों इसे बदलने के लिए अक्सर

संपादित करें: अप्रैल 28, 2009: 10:20 ईएसटी: मैं वास्तव में एक NSString का आवंटन करने का सुझाव के रूप में आप तकनीकी रूप से dealloc में इसे जारी करना चाहिए।

संपादित करें: अप्रैल 28, 200 9: 11:11 पूर्वाह्न ईएसटी: मैंने UIViewController के init के संस्करण का उपयोग करने के लिए @ कार्यान्वयन को अद्यतन किया।

+0

उत्तर मैं तो बस से मुलाकात की है कि इसकी एक ViewController । और हाँ प्रदर्शन को अक्सर बदलना होगा। धन्यवाद – MrHus

+0

बस स्पष्ट होने के लिए, जब मैंने डिस्प्ले इंस्टेंस वैरिएबल को अक्सर बदलते हुए लिखा, तो मेरा मतलब वैरिएबल का वास्तविक * इंस्टेंस * है। प्रदर्शन ऑब्जेक्ट में वास्तविक डेटा नहीं है। तो यदि आप कल्पना कर सकते हैं कि आप डिस्प्ले इंस्टेंस वैरिएबल को नष्ट कर रहे हैं और फिर से बना रहे हैं, तो यह समझ में आएगा। –

+0

ठीक है मैं समझता हूं कि एक चर के बिना प्रदर्शन कैसे बदलें। लेकिन - (आईडी) init बुलाया नहीं जाता है। कोई कारण क्यों? – MrHus

3

एक और विकल्प आपकी इनपुट संपत्ति के लिए अपना खुद का गेट लिखना है, और यदि आवृत्ति चर शून्य है तो "" वापस लौटना है। यह तब भी काम करेगा जब आप गलती से या जानबूझकर इनपुट करने के लिए नियुक्त करते हैं, जबकि डिफ़ॉल्ट मान सेट करने के लिए init का उपयोग करना टूट जाएगा।

+0

एक अच्छा समाधान है, लेकिन सामान्य अभ्यास नहीं है। आपके कोड के अन्य पाठक डिफ़ॉल्ट मान के लिए नामित प्रारंभकर्ता को देख सकते हैं। –

+1

मैं यह नहीं कहूंगा कि, नील के बजाए एक खाली वस्तु को वापस करना कोको में काफी आम है। यह कहना नहीं है कि इसे init में सेट करना एक बुरा या कुछ भी है, यह वरीयता का विषय है। –

9

बहुत अच्छा सवाल है। संक्षिप्त जवाब init फ़ंक्शन में मानों को init करना है। आपको डिफ़ॉल्ट init फ़ंक्शन को ओवरराइट करने की आवश्यकता है ताकि वस्तु का उपयोग करने से पहले डिफ़ॉल्ट मान तैयार हो। मैं सुझाव देना चाहता हूं कि लोग दस्तावेज़ पढ़ने के लिए दूसरों को सुझाव देना बंद करें; यदि आप कर सकते हैं तो कृपया सीधे प्रश्न का उत्तर दें।

+4

लोग जो कहते हैं "ब्ला ब्ला ब्लाह शायद आपको दस्तावेज़ों को पढ़ना चाहिए" को स्पैंक किया जाना चाहिए, अचंभित होना चाहिए, और नफरत की जानी चाहिए। वे गूंगा हैं। –

+0

एसओ पर समलैंगिक वोटिंग एलेक्स समलैंगिक क्योंकि मैं इस भावना से बहुत सहमत हूं। –

+4

मेरा मतलब है, एलेक्स ग्रे –

0

सबसे स्पष्ट तरीका लागू करने के लिए वह ऐसा होगा:

  1. अपने viewcontroller.m फ़ाइल में, डिफ़ॉल्ट init विधि ओवरराइड। इस विधि को हर बार एक व्यू कंट्रोलर प्रारंभ किया जाता है। तो, यह आपके चर को प्रारंभ करने का सबसे अच्छा तरीका है।

    - (id)initWithNibName:(NSString*)aNibName bundle:(NSBundle*)aBundle { 
        self = [super initWithNibName:aNibName bundle:aBundle]; // The UIViewController's  version of init 
        if (self) { 
         varName = [[NSString alloc] initWithString:@""]; 
        } 
        return self; 
    } 
    
  2. अब, जहाँ अपने कोड में आप अपने मूल स्ट्रिंग के लिए एक स्ट्रिंग संलग्न करना चाहते हैं, बस का उपयोग करें: अपने एक CalcViewController फ़ाइल नोट करने के लिए varName = [NSString stringwithformat:@"%@%@", varName, newString];