2009-04-15 11 views
1

私はviewControllerのインスタンスを作成し、そのプロパティのテキストUILabelを設定しようとしています。インスタンス化の後にViewControllerのプロパティを設定する

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]; 

だから私は次のことを試してみました...

を、私はこれを試してみましたが、それはうまくいきませんでした:

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]; 

しかし、無駄..

を私はありませんBoyViewControllerでUILabelの "sign"のテキストプロパティを設定できない理由を教えてください。

答えて

1

Interface Buildでアウトレットをバインドしましたかそう?

最初の例の符号出口をInterface Builderにバインドして、実際にそのテキストを任意の値に設定する必要があるようです。

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

Thisあなたが結合について知っておくべきである:あなたがInterface Builderので、実際のUIコンポーネントへのあなたの口をバインドすると

、あなたのような何かを行うことができるはず。

あなたの2番目の例は私には全く意味がありません。

4

ここでの問題は、イニシャライザが実際にnibファイルをメモリにロードしないことです。代わりに、アプリケーションがView Controllerのviewプロパティを要求するまで、ペン先の読み込みは遅延されます。したがって、コントローラのsignプロパティにアクセスすると、そのプロパティはnullになります。

手動であなたの例の仕事になるだろう、コントローラのviewプロパティを要求...しかし

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... 

、私はあなたが本当に何をしようとして作成し、それを設定する前に、あなたのビューコントローラを設定していることを推測すると思います自分自身のことを自由にすることができます。 (おそらくそれをモーダルで表示すると言うと)手動で[... view]を呼び出すことは、長期的な解決策にはなりません。

良いが、ラベルテキストのためにあなたのビューコントローラ上の別のプロパティを設定し、ラベルに割り当てるviewDidLoadを実装することです:

@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 

これは、ケースであなたのラベルテキストビーイングのリセットの追加の利点を持っています低メモリーイベント中にビューがパージされます。