2010-12-30 5 views
0

私のメインクラスのMMAppViewControllerには "IBOutlet UIImageView * padlock"があります。このコントローラは、私のクイズゲームであるLevel1Viewビューをプッシュします。 MMAppViewContollerには、レベル1とレベル2の2つのボタンがあります。レベル2には南京錠があり、特定のスコアに達するとロックが解除されます。 MMAppViewControllerがプッシュバックされると、南京錠を隠す方法があります。私は、次のコードはこれを行うだろう知っているが、私の問題は、コードを配置する場所にある:objective-c初心者 - 異なるクラスのアウトレットの変更に関するヘルプが必要

if(theScore>4){ 
     [padlock setHidden:TRUE]; 
} 

私Level1Viewで、私は「のviewDidLoad()」セクションにコードを置くことができますが、それは私のメインでは動作しません。それは一度だけロードされるように見えるからです!私は私のLevel1Viewクラスのコードをputing試みたが、トークンについてのエラーを得続けるか、それが宣言されていないされている:

[MMAppViewController padlock setHidden:TRUE]; 
or 
[padlock setHidden:TRUE]; 

は私のLevel1Viewクラスでこのコードを置くのいずれかの方法はありますか、コードを持っていることの方法があります私のMMAppViewContollerクラスで、Level1Viewが "unpushed"されているときに動作しますか? (用語がわからない)

答えて

0

プログラムの構造について詳しく知りませんが、これを達成する正しい方法を知ることは難しいです。

考えられるアプローチはいくつかありますが、viewDidLoadは一度だけ呼び出されるため、この種の繰り返しロジックではなく、ビューの初期設定に使用する必要があります。あなたはおそらくスコアを保持するモデルオブジェクトをどこかに持っています。 (そうでない場合、つまり、ScoreがViewControllerのインスタンス変数である場合、スニペットが暗示しているように、独自のモデルオブジェクトに移動する必要があります)。これについては、ViewControllerが "監視するKey-Value Observingを使用してスコアを保持するモデルオブジェクトです。ここでは、それを達成かもしれない方法は次のとおりです。

は、あなたが(、ここでの唯一の現在のスコアを)あなたのゲームセッションデータを保持するために、次のモデルオブジェクトがあるとしましょう:

@interface GameSession : NSObject 
@property (readwrite) double score; 
@end 

...とそれに対応する実装.. 。

@implementation GameSession 
@synthesize score; 
@end 

そして、あなたはこのような何かに見えるのViewController宣言を持っていると仮定すると:

@class GameSession; 

@interface MyViewController : UIViewController 
{ 
    GameSession *game; 
    IBOutlet UIImageView *padlock; 
} 

@end 

あなたはモデルオブジェクトのスコア値が変更されるたびに、のViewControllerが自動的に南京錠の画像ビューの隠された状態に更新するような、のViewControllerで次のメソッドを設定することができます。aについて

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    game = [[GameSession alloc] init];  
    [game addObserver:self forKeyPath:@"score" options:NSKeyValueObservingOptionInitial context: [RootViewController class]]; 

} 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if (context == [RootViewController class]) 
    { 
     if ([keyPath isEqualToString: @"score"]) 
     { 
      NSNumber* newValue = [change objectForKey: NSKeyValueChangeNewKey]; 
      double currentScore = [newValue doubleValue]; 
      [padlock setHidden: (currentScore < 4.)]; 
     } 
    } 
    else 
    { 
     [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; 
    } 
} 


- (void)dealloc 
{ 
    [game removeObserver:self forKeyPath:@"score"]; 
    [game release]; 
    game = nil; 
    [super dealloc]; 
} 

をKey-Value Observingの詳細な説明は、このWebページをご覧ください。http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/KeyValueObserving/

これがはっきりしない場合は教えてください。

+0

ええ、私はその方法を見ていましたが、より簡単な選択肢は、レベル2のボタンにコードを追加することでした。おそらく最高のコーディング練習ではないかもしれませんが、私の割り当てはすぐに予定されており、最も速いオプションを選択しなければなりませんでした。でもありがとう! –

0

単純なオプションは、コードをviewWillAppear:に入れることです。