2009-04-28 6 views
14

Hallo ich den folgenden Code in einem ViewController.h haben:Objective-c Iphone wie für eine Eigenschaft Standardwert setzen

#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 

Das Problem ist, dass ich eine Zeichenfolge eingeben anhängen wollen, aber diese ist nicht möglich, wenn es noch null ist. Deshalb möchte ich den Standardwert der Eingabe auf @ "" setzen. Aber wo stelle ich diesen Code her?

Ich kenne eine mögliche Lösung, wo Sie es in einem Standardkonstruktor setzen. Aber ich habe keine Ahnung in welcher Akte ich das stellen soll. Und wo ich es nennen sollte.

Ich habe leider nur ein begrenztes Verständnis von C und realisiere, dass vielleicht eine .h-Datei nicht der richtige Ort ist.

Der Projekttyp ist eine View-Based-Application, falls Sie diese benötigen.

Ich hoffe, Sie können helfen.

Antwort

16

Sie können es nützlich finden, einige Dokumentation zu Objective-C oder Cocoa zu lesen. Sie können wahrscheinlich einige gute Vorschläge zum Lesen von Material finden, wenn Sie hier in StackOverflow oder Google suchen.

Um Ihre Frage zu beantworten, sollten Sie eine @ Implementierung von CalcViewController haben. Am häufigsten wird diese @ Implementierung in die * .m-Datei eingefügt. Wenn Ihre * .h Datei den Namen "ViewController.h" hat, dann würde die Implementierung in "ViewController.m" gehen.

Sie würden dann eine Kopie der Initialisierungsfunktion des UIViewControllers erstellen und sie dort platzieren (ich weiß nicht, was die Standard-Init-Funktion ist).

Zum Beispiel:

@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 

NOTES:

  • Sie können die Datei auf CalcViewController umbenennen möchten. Ich glaube, es ist einfacher für die Xcode-Refactoring-Engine.
  • Sie müssen die Eigenschaft @property für die Anzeigeinstanzvariable nicht deklarieren, wenn Sie diese mit dem Interface Builder verbinden. Es sei denn, Sie Kunden der CalcViewController es ändern möchten oft

EDIT: 28. April 2009: 10.20 Uhr EST: Ich schlage vor, die Zuteilung tatsächlich eine NSString, wie Sie es technisch in der dealloc loslassen sollte.

EDIT: 28. April 2009: 11:11 EST: Ich aktualisierte die @ Implementierung, um die Version von INIViewController von init zu verwenden.

+0

Antwort seine eine CalcViewController Datei zu beachten, traf ich nur, dass ihr ein Viewcontroller . Und ja, das Display muss sich oft ändern. Danke – MrHus

+0

Nur um klar zu sein, wenn ich über die häufig wechselnde Anzeigeinstanzvariable schrieb, meine ich die tatsächliche * Instanz * der Variable. Nicht die tatsächlichen Daten im Anzeigeobjekt. Wenn Sie sich also vorstellen können, dass Sie die Anzeigeinstanzvariable zerstören und neu erstellen, wäre dies sinnvoll. –

+0

Ok ich werde herausfinden, wie sich die Anzeige ohne eine Variable ändert. Aber - (id) init wird nicht aufgerufen. Irgendein Grund warum? – MrHus

3

Eine andere Möglichkeit besteht darin, einen eigenen Getter für Ihre Eingabeeigenschaft zu schreiben und @ "" zurückzugeben, wenn die Instanzvariable null ist. Dies würde auch dann funktionieren, wenn Sie versehentlich oder absichtlich nil der Eingabe zugewiesen haben, während die Verwendung von init zum Festlegen eines Standardwerts unterbrochen wird.

+0

Eine gute Lösung, aber keine gängige Praxis. Andere Leser Ihres Codes suchen wahrscheinlich nach dem angegebenen Initialisierer für den Standardwert. –

+1

Ich würde das nicht sagen, das Zurückgeben eines leeren Objekts anstelle von Null ist in Cocoa ziemlich üblich. Das heißt nicht, dass es in schlechtem oder schlechtem Zustand ist, es ist eher eine Frage der Präferenz. –

9

Sehr gute Frage. Die kurze Antwort besteht darin, die Werte in der init-Funktion zu initialisieren. Sie müssen die Standard-Init-Funktion überschreiben, so dass der Standardwert bereit ist, bevor das Objekt verwendet werden kann. Ich möchte vorschlagen, dass Leute aufhören, anderen zu empfehlen, Dokumente zu lesen; Bitte beantworte die Frage direkt, wenn du kannst.

+4

Leute, die sagen "Blah blah blah, vielleicht solltest du die Dokumente lesen", sollten verprügelt, geächtet und verhasst werden. Sie sind dumm. –

+0

Up-voting Alex Gay überall in SO, weil ich mit diesem Gefühl so sehr einverstanden bin. –

+4

Ich meine, Alex grau –

0

Der offensichtlichste Weg zu implementieren es wie folgt aussehen würde:

  1. In Ihrer viewcontroller.m Datei, die Standard-Init-Methode außer Kraft setzen. Diese Methode wird jedes Mal aufgerufen, wenn ein Ansichtscontroller initialisiert wird. Also, es ist der beste Weg, um Ihre Variable zu initialisieren.

    - (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. Jetzt, wo auch immer in Ihrem Code Sie eine Zeichenfolge an Ihre Original-Zeichenkette angehängt werden soll, verwenden Sie einfach: varName = [NSString stringwithformat:@"%@%@", varName, newString];