开发者

objective-c Novice - Needs help with changing outlets in different classes

开发者 https://www.devze.com 2023-02-02 08:19 出处:网络
My main class MMAppViewController has an \"IBOutlet UIImageView *padlock\". This controller pushes a Level1View view which is my quiz game. The MMAppViewContoller has 2 buttons level 1 and level 2. Le

My main class MMAppViewController has an "IBOutlet UIImageView *padlock". This controller pushes a Level1View view which is my quiz game. The MMAppViewContoller has 2 buttons level 1 and level 2. Level 2 has the padlock on it and will unlock when a certain score is reached. When the MMAppViewController is pushed back, is there a way to hide the padlock. I know the following code will do this but my problem lies in where to put the code:

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

With my Level1View i can put code in the "viewdidload()" section, but it does not work with my main view because it only seems to load once! I tried puting the code in my Level1View class but keep getting errors about tokens or it being undeclared:

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

Is there a way of either putting this 开发者_StackOverflow中文版code in my Level1View class, or is there a way of having the code in my MMAppViewContoller class that will work when Level1View is "unpushed"?? (not sure of terminology)


Not knowing more about the structure of your program it's hard to know the right way to achieve this.

There are several possible approaches, but viewDidLoad is only going to be called once and should be used for setting up the view initially, and not for this sort of repeated logic. You probably have a model object somewhere that holds the score. (If you don't, i.e. if theScore is an instance variable on your ViewController, as your snippets might imply, you should move it to it's own model object.) The best way to go about this would be for your ViewController to "observe" the model object that holds the score using Key-Value Observing. Here's how you might achieve that:

Let's say you have the following model object to hold your game session data (here, only the current score):

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

... and its corresponding implementation ...

@implementation GameSession
@synthesize score;
@end

And then assuming you have a ViewController declaration that looks something like this:

@class GameSession;

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

@end

You could set up the following methods on the ViewController, such that every time the score value of the model object is modified, the ViewController will automatically update the hidden state of the padlock image view:

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

For a full explanation of Key-Value Observing, see this web page: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/KeyValueObserving/

Let me know if this isn't clear.


The simple option is to put the code in viewWillAppear:.

0

精彩评论

暂无评论...
验证码 换一张
取 消