2009-04-28 8 views
14

Ciao io ho il seguente codice in un ViewController.h:Objective-C Iphone come impostare il valore predefinito per una proprietà

#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 

Il problema è che voglio aggiungere una stringa all'ingresso, ma questo non è possibile quando è ancora nullo. Ecco perché voglio impostare il valore predefinito di input su @ "". Ma dove metto questo codice.

Sono a conoscenza di una possibile soluzione in cui viene inserita in un costruttore predefinito. Ma non ho idea di quale file mettere. E da dove dovrei chiamarlo.

Purtroppo ho solo una conoscenza limitata di C e mi rendo conto che forse un file .h non è il posto giusto.

Il tipo di progetto è un'applicazione View-Based se è necessario.

Spero che tu possa aiutare.

risposta

16

Potrebbe essere utile leggere alcuni documenti su Objective-C o Cocoa. Probabilmente puoi trovare alcuni buoni suggerimenti sul materiale di lettura se esegui una ricerca qui in StackOverflow o su Google.

Per rispondere alla tua domanda, dovresti avere una @implementazione di CalcViewController. Spesso si posiziona questa implementazione @ all'interno del file * .m. Se il tuo file * .h è denominato "ViewController.h", l'implementazione andrebbe in "ViewController.m".

Si dovrebbe quindi creare una copia della funzione di inizializzazione di UIViewController e posizionarla lì (non so quale sia la funzione di inizializzazione predefinita).

Ad esempio:

@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 

NOTE:

  • Si può decidere di rinominare il file in CalcViewController. Credo che sia più facile gestire il motore di refactoring di Xcode.
  • Non è necessario dichiarare @property per la variabile di istanza di visualizzazione durante la connessione a Interface Builder. A meno che non si desidera che i client del CalcViewController di cambiare spesso

EDIT: 28 APRILE 2009: 10:20 EST: Suggerisco in realtà l'assegnazione di un NSString come si dovrebbe tecnicamente rilasciarlo nel dealloc.

MODIFICA: 28 aprile 2009: 11:11 EST: Ho aggiornato l'@implementation per utilizzare la versione di init di UIViewController.

+0

risposta da notare il suo un file di CalcViewController ho appena incontrato che è un ViewController . E sì, lo schermo deve cambiare spesso. Grazie – MrHus

+0

Giusto per essere chiari, quando ho scritto sulla variabile di istanza di visualizzazione che cambia spesso, intendo l'effettiva * istanza * della variabile. Non i dati effettivi nell'oggetto di visualizzazione. Quindi, se riesci a immaginare che distruggerai e ricreare la variabile di istanza di visualizzazione, allora avrebbe senso. –

+0

Ok, immagino come cambiare il display senza una variabile. Ma - (id) init non viene chiamato. Qualche ragione per cui? – MrHus

3

Un'altra opzione è scrivere il proprio getter per la proprietà di input e restituire @ "" se la variabile di istanza è nulla. Ciò funzionerebbe anche se per errore è stato assegnato accidentalmente o intenzionalmente nulla, mentre l'utilizzo di init per impostare un valore predefinito si interromperà.

+0

Una buona soluzione, ma pratica non comune. Gli altri lettori del tuo codice probabilmente guarderanno l'inizializzatore designato per il valore predefinito. –

+1

Non direi questo, restituire un oggetto vuoto invece di zero è abbastanza comune in tutto Cocoa. Questo non vuol dire che impostarlo in init è un brutto o altro, è più una questione di preferenza. –

9

Ottima domanda. La risposta breve è di iniziare i valori nella funzione init. È necessario sovrascrivere la funzione di inizializzazione predefinita in modo che il valore predefinito sia pronto prima che l'oggetto possa essere utilizzato. Vorrei suggerire alle persone di smettere di suggerire agli altri di leggere il documento; per favore rispondi direttamente alla domanda se puoi.

+4

Le persone che dicono "bla bla bla forse dovresti leggere i documenti" dovrebbero essere sculacciate, ostracizzate e odiate. sono stupidi –

+0

Up-voting alex gay in tutto SO perché sono d'accordo con questo sentimento così tanto. –

+4

Voglio dire, alex gray –

0

Il modo più ovvio per attuare sarebbe come segue:

  1. Nel file viewcontroller.m, l'override del metodo di default init. Questo metodo viene chiamato ogni volta che viene inizializzato un controller di visualizzazione. Quindi, è il modo migliore per inizializzare la variabile.

    - (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. Ora, dovunque nel codice che si desidera aggiungere una stringa al vostro stringa originale, è sufficiente utilizzare: varName = [NSString stringwithformat:@"%@%@", varName, newString];