2009-04-28 9 views
14

Witam Mam następujący kod w ViewController.h:Objective-C Iphone jak ustawić domyślną wartość dla właściwości

#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 

Problemem jest to, że chcę, aby dołączyć ciąg do wejścia, ale to nie jest możliwe, gdy jest nadal pusty. Właśnie dlatego chcę ustawić domyślną wartość wejścia na @ "". Ale gdzie umieścić ten kod.

Jestem świadomy jednego z możliwych rozwiązań, w którym umieścisz go w domyślnym konstruktorze. Ale nie mam pojęcia, w jakim pliku to umieścić. I skąd powinienem to nazwać.

Niestety, mam tylko ograniczone zrozumienie C i zdaję sobie sprawę, że być może plik .h nie jest właściwym miejscem.

Typ projektu to aplikacja oparta na widoku, jeśli jest to potrzebne.

Mam nadzieję, że możesz pomóc.

Odpowiedz

16

Może się przydać przeczytanie dokumentacji dotyczącej Objective-C lub kakao. Prawdopodobnie możesz znaleźć jakieś dobre sugestie dotyczące czytania materiałów, jeśli przeprowadzisz wyszukiwanie tutaj w StackOverflow lub w Google.

Aby odpowiedzieć na twoje pytanie, powinieneś mieć @implementację CalcViewController. Najczęściej umieszcza się tę @ implementację w pliku * .m. Jeśli twój plik * .h ma nazwę "ViewController.h", wówczas jego implementacja nastąpi w "ViewController.m".

Następnie należy utworzyć kopię funkcji inicjalizacyjnej UIViewController i umieścić ją tam (nie wiem, jaka jest domyślna funkcja init).

Na przykład:

@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 

UWAGI:

  • Możesz zmienić nazwę pliku do CalcViewController. Uważam, że łatwiej jest sobie poradzić z silnikiem refaktoryzacji Xcode'a.
  • Nie musisz zadeklarować wartości @ Właściwość dla zmiennej instancji wyświetlacza podczas łączenia jej z narzędziem Interface Builder. Chyba że chcesz klientami CalcViewController go zmieniać często

EDIT: 28 kwietnia 2009: 10:20 EST: Proponuję faktycznie alokowanie NSString jak należy technicznie zwolnić go w dealloc.

EDIT: 28 kwietnia 2009: 11:11 EST: I uaktualniony @implementation używać wersji na UIViewController dotyczącą init.

+0

Odpowiedź zauważyć jego plik CalcViewController Właśnie spotkałem że jego ViewController . I tak, wyświetlacz musi często się zmieniać. Dzięki – MrHus

+0

Po prostu jasne, kiedy często pisałem o zmiennej instancji wyświetlacza, mam na myśli rzeczywistą * instancję * zmiennej. Nie rzeczywiste dane w obiekcie wyświetlanym. Więc jeśli możesz sobie wyobrazić, że będziesz niszczyć i ponownie tworzyć zmienną instancji wyświetlania, to miałoby to sens. –

+0

OK Postaram się zmienić sposób wyświetlania bez zmiennej. Ale - (id) init nie zostanie wywołany. Jakiś powód, dlaczego? – MrHus

3

Inną opcją jest napisanie własnego gettera dla właściwości wejściowej i powrót @ "", jeśli zmienna instancji jest zerowa. To działałoby, nawet jeśli przypadkowo lub celowo przypisano zero, aby wprowadzić, podczas gdy użycie init do ustawienia wartości domyślnej by się zepsuło.

+0

Dobre rozwiązanie, ale nie powszechna praktyka. Inni czytelnicy twojego kodu prawdopodobnie będą szukać wyznaczonego inicjalizatora dla wartości domyślnej. –

+1

Nie powiedziałbym tego, zwracanie pustego obiektu zamiast zerowego jest dość powszechne w całym Cocoa. Nie znaczy to, że ustawienie go w init jest złe lub cokolwiek, jest to bardziej kwestia preferencji. –

9

Bardzo dobre pytanie. Krótka odpowiedź to zainicjowanie wartości w funkcji init. Musisz nadpisać domyślną funkcję init, aby domyślna wartość była gotowa, zanim obiekt będzie mógł być użyty. Chciałbym zasugerować, aby ludzie przestali sugerować innym czytanie dokumentu; proszę odpowiedzieć bezpośrednio na to pytanie, jeśli możesz.

+4

Ludzie, którzy mówią "bla, bla, bla, może powinieneś czytać w dokumentach", powinni być lanie, odrzuceni i znienawidzeni. są głupi. –

+0

Głosowanie w górę alex gej na całym SO, ponieważ tak bardzo zgadzam się z tym sentymentem. –

+4

Mam na myśli, alex szary –

0

Najbardziej oczywistym sposobem wdrożenia to będzie jak następuje:

  1. W pliku viewcontroller.m, zastąpić domyślną metodę init. Ta metoda jest wywoływana za każdym razem, gdy inicjowany jest kontroler widoku. To najlepszy sposób na zainicjowanie zmiennej.

    - (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. Teraz, gdziekolwiek w kodzie chcesz dołączyć ciąg do oryginalnego napisu, wystarczy użyć: varName = [NSString stringwithformat:@"%@%@", varName, newString];