2010-12-30 16 views
0

Meine Hauptklasse MMAppViewController Ändern ein „IBOutlet UIImageView * Schloss“ hat. Dieser Controller drückt eine Level1View-Ansicht, die mein Quizspiel ist. Der MMAppViewContoller verfügt über 2 Tasten der Stufe 1 und 2. Stufe 2 hat das Vorhängeschloss und wird entsperrt, wenn eine bestimmte Punktzahl erreicht ist. Wenn der MMAppViewController zurückgeschoben wird, gibt es eine Möglichkeit, das Vorhängeschloss zu verbergen. Ich weiß, dass der folgende Code dies tun, aber mein Problem liegt in dem, den Code zu setzen:Objective-C Anfänger - braucht Hilfe mit Filialen in verschiedenen Klassen

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

Mit meinem Level1View i-Code in dem „viewDidLoad()“ Abschnitt setzen, aber es funktioniert nicht mit meinem Haupt anzeigen, weil es nur einmal zu laden scheint! Ich habe versucht, den Code in meiner Level1View Klasse Puting aber immer Fehler über Token bekommen oder es nicht deklariert werden:

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

Gibt es eine Möglichkeit, entweder den Code in meiner Level1View Klasse setzen, oder gibt es eine Möglichkeit, den Code des Habens in meiner MMAppViewContoller-Klasse, die funktioniert, wenn Level1View "unpushed" ist? (Nicht sicher, ob die Terminologie)

Antwort

0

nicht mehr über die Struktur Ihres Programms zu wissen, ist es schwer, den richtigen Weg zu wissen, dies zu erreichen.

Es gibt mehrere mögliche Ansätze, aber viewDidLoad wird nur einmal aufgerufen gehen werden und sollte für den Aufbau der Ansicht zunächst, und nicht für diese Art von Logik wiederholt verwendet werden. Wahrscheinlich hast du irgendwo ein Modellobjekt, das die Punkte enthält. (Wenn dies nicht der Fall ist, dh wenn theScore eine Instanzvariable auf Ihrem ViewController ist, wie es Ihre Snippets möglicherweise andeuten, sollten Sie sie in ihr eigenes Modellobjekt verschieben.) Der beste Weg, dies zu tun, wäre, Ihren ViewController zu beobachten "Das Modellobjekt, das die Bewertung mit Schlüsselwertbeobachtung enthält. Hier ist, wie Sie vielleicht das erreichen:

Angenommen, Sie haben das folgende Modell bezwecken Ihre Spielsitzung Daten zu halten (hier nur die aktuelle Punktzahl):

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

... und die entsprechende Umsetzung .. .

@implementation GameSession 
@synthesize score; 
@end 

Und dann vorausgesetzt, Sie haben eine Viewcontroller Erklärung, die etwa wie folgt aussieht:

@class GameSession; 

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

@end 

Sie können die folgenden Methoden auf dem Viewcontroller, so eingerichtet, dass jedes Mal, wenn der Score-Wert des Modellobjekts geändert wird, automatisch das Viewcontroller wird den verborgenen Zustand der Vorhängeschloss Bildansicht aktualisieren:

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

Für eine vollständige Erklärung der Schlüsselwert Observing finden Sie auf dieser Webseite: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/KeyValueObserving/

Lassen Sie mich wissen, wenn dies nicht klar ist.

+0

Hmm, ja ich hatte einen Blick auf diese Methode aber entschieden eine einfachere Möglichkeit, den Code auf der Ebene 2 Taste hinzuzufügen war. Probly nicht beste Programmierpraxis, aber meine Aufgabe ist in Kürze fällig und musste die schnellste Option wählen. Aber danke! –

0

Die einfache Möglichkeit ist, den Code in viewWillAppear: zu setzen.

Verwandte Themen