2012-02-14 7 views
1

xCodeを使用しています。4.2.1 - Webサービスを使用するアプリケーションがあり、カスタムクラスとNSURLConnectionを使用してデータを取得します。ユーザーは、プロジェクト内のいくつかのカスタムクラスで発生する一連のイベントを開始する「更新」ボタンをタップし、MainViewControllerのメソッドで返すプロパティと一緒にオブジェクトを取得できます。 IBOutletのテキストを返されたオブジェクトのプロパティ(NSString)に変更できません。IBOutletのテキストをカスタムクラスから返されたオブジェクトのプロパティに変更します。

IBOutlet UILabel *textLabel; 

と::

@property (nonatomic, retain) IBOutlet UILabel *textLabel; 

そして、私が合成されてきた私の「MainViewController.h、私はIBOutletを持っている(そしてそれはMainViewController.xibでボタンに配線されます)で

MainViewController.mのラベル

@synthesize textLabel; 

このプロセスは次のようになります。リフレッシュボタンタップ - >消火MainViewControllerでのsa mthod - >カスタムクラス内の別の方法を発射(オブジェクトを作成し、ウェブからデータを取得する) - > MainViewControllerにオブジェクトを送信経由:(私のカスタムクラスの実装で)

// parsing, etc.. and define a string for priceString property of mp object  
MainViewController *mvc = [[MainViewController alloc] init]; 
    [mvc log:mp]; 

そして、私のMainViewControllerで私はそのオブジェクトのプロパティにアクセスし、このメソッドからちょうど良いNSLogで印刷できます。

- (void) log:(Price *)mp { 

    self.textLabel.text = mp.priceString; 
    NSLog(@"%@", mp.priceString); 
} 

この時点で、ログにデータが表示されますが、textLabelのテキストは変更されません。

私は1週間サンプルを読んでいましたが、代表からNSNoticationの回答まですべて聞いたことがありますが、何も動作していないようです。

私が行う必要があるのは、 - (void)メソッドからIBOutletを生成することだけです。 ご協力いただければ幸いです。私は委任を実装するためにダウンしていますが、私は非常に新しいので、例を探しています。

EDIT - 詳細。

私のオブジェクトを返すNSURLConnectionは別のクラスにあり、viewDidLoadで接続を開始するスレッドをたくさん読んでいることに注意してください。

+0

が表示されます

? UILabelまたはUIButtonに? –

+0

textLabelというアウトレットはUILabelに配線されています。プロセス全体を開始するIBActionは、ナビゲーションバーのボタンに配線されています。問題はそれが外に出て、必要なすべてのデータを取得した後です。 viewDidLoadメソッドの以外のUI(NIB)ラベルを更新するにはどうすればよいですか?つまり、返されたデータはメインスレッドの外側に戻ります。 – jhilgert00

+0

このメソッドをviewDidLoad内から呼び出して、値が返されるまでメインスレッドを遅延させることはできますか? - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone :(BOOL)wait – jhilgert00

答えて

1

問題は、ビューコントローラを初期化した直後に[mvc log:mp];を呼び出すことです。その段階では、ビューはまだxibファイルからロードされません。

あなたはそれを見てlogを変更することができます。

- (void) log:(Price *)mp { 
    if (self.textLabel) { 
     self.textLabel.text = mp.priceString; 
    } else { 
     NSLog(@"textLabel is nil."); 
    } 
} 

あなたはビューコントローラviewDidLoad方法で[mvc log:mp];を呼び出すか、のviewDidLoadが実行された後にすることができます。

NSLog(@"viewDidLoad.");viewDidLoadメソッドに追加し、ビューコントローラを初期化したコードの直後にNSLog(@"viewController initialized.");を追加します。あなたはIBOutletはInterface Builderで配線されてください。次

viewController initialized. 
textLabel is nil. // if you call log as usual after initializing the view controller. 
viewDidLoad. 
+0

ありがとう、答えているが、あなたが参照しているinitコードは、私のカスタムクラスではなく、MainViewController、私はそれが私の問題の一部だと信じています。私はデリゲートを使用していないので、MainViewController UILabelsへのアクセスを取得しようとしていました。 – jhilgert00

関連する問題