2009-04-15 6 views
1

Ich erstelle eine Instanz eines ViewControllers und versuche dann, den Text seiner Eigenschaften zu definieren, ein UILabel.Einstellen der Eigenschaften eines ViewControllers nach der Instanziierung

BoyController *boyViewController = [[BoyController alloc] initWithNibName:@"BoyView" bundle:nil]; 
     NSString *newText = [astrology getSignWithMonth:month withDay:day]; 
     boyViewController.sign.text = newText; 
     NSLog(@" the boyviewcontroller.sign.text is now set to: %@", boyViewController.sign.text); 
     [newText release]; 

Ich versuchte dies, aber es hat nicht funktioniert ...

Also versuchte ich folgendes:

BoyController *boyViewController = [[BoyController alloc] initWithNibName:@"BoyView" bundle:nil]; 
    UILabel *newUILabel = [[UILabel alloc] init]; 
    newUILabel.text = [astrology getSignWithMonth:month withDay:day]; 
    boyViewController.sign = newUILabel; 
    NSLog(@" the boyviewcontroller.sign.text is now set to: %@", newUILabel.text); 
    [newUILabel release]; 

Aber ohne Erfolg ..

Ich bin nicht sicher, warum ich nicht die Text-Eigenschaft des UILabel "Zeichen" in BoyViewController setzen kann.

Antwort

1

Haben Sie Ihre Steckdosen bei Interface Build binden äh?

Es scheint, dass Sie Zeichen Ausgang des ersten Beispiels in Interface Builder binden müssen, um diesen Text wirklich zu setzen, was auch immer Sie wollen.

Sobald Sie Ihre Steckdose an die tatsächliche UI-Komponente an Interface Builder binden, dann sollten Sie in der Lage sein, etwas zu tun:

NSString *newText = [astrology getSignWithMonth:month withDay:day]; 
[[boyViewController sign] setText:newText]; 

This ist, was Sie über die Bindung an wissen müssen.

Ihr zweites Beispiel ergibt für mich überhaupt keinen Sinn.

4

Das Problem hier ist, dass der Initialisierer nicht tatsächlich die NIB-Datei in den Speicher lädt. Stattdessen wird das Laden der Feder verzögert, bis Ihre Anwendung die view-Eigenschaft des Ansichtscontrollers anfordert. Daher ist die Eigenschaft Ihres Controllers null, wenn Sie darauf zugreifen.

Sie manuell die view Eigenschaft des Controllers anfordernden würde Ihr Beispiel Arbeit ...

BoyController *boyViewController = [[BoyController alloc] initWithNibName:@"BoyView" bundle:nil]; 

[boyViewController view]; // !!!: Calling [... view] here forces the nib to load. 

NSString *newText = [astrology getSignWithMonth:month withDay:day]; 
boyViewController.sign.text = newText; 
// and so on... 

Allerdings machen, ich würde vermuten, dass das, was Sie wirklich versuchen, Ihre View-Controller zu tun ist, erstellen und konfigurieren, bevor es Einstellung frei, es ist eine eigene Sache. (Vielleicht, um es modal anzuzeigen, sagen Sie.) [... view] manuell aufrufen wird keine langfristige Lösung sein.

Besser ist eine separate Eigenschaft auf Ihrem View-Controller für den Beschriftungstext zu setzen und dann viewDidLoad implementieren es auf dem Etikett zuweisen: Diese

@interface BoyViewController : UIViewController { 
    IBOutlet UILabel *label; 
    NSString *labelText; 
} 
@property(nonatomic, copy)NSString *labelText; 
@end 

@implementation 
@synthesize labelText; 

- (void)viewDidLoad 
{ 
    [label setText:[self labelText]]; 
} 

// and so on... 

@end 

hat den zusätzlichen Vorteil des Etikettentext zurücksetzen, falls sein Die Ansicht wird während eines Speicherereignisses gelöscht.