objective-c新手 - 需要帮助改变不同班级的出路

时间:2010-12-30 18:44:10

标签: iphone objective-c

我的主类MMAppViewController有一个“IBOutlet UIImageView *挂锁”。该控制器推送Level1View视图,这是我的测验游戏。 MMAppViewContoller有2个级别1和2级按钮。级别2上有挂锁,当达到某个分数时将解锁。当推回MMAppViewController时,有没有办法隐藏挂锁。我知道以下代码会这样做,但我的问题在于放置代码的位置:

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

使用我的Level1View我可以将代码放在“viewdidload()”部分,但它不能用于我的主视图,因为它似乎只加载一次!我尝试将代码放在我的Level1View类中,但不断收到有关令牌的错误或未声明的错误:

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

有没有办法将此代码放在我的Level1View类中,还是有一种方法可以让我的MMAppViewContoller类中的代码在Level1View被“未按下”时工作? (不确定术语)

2 个答案:

答案 0 :(得分:0)

不了解程序结构的更多信息,很难知道实现这一目标的正确方法。

有几种可能的方法,但viewDidLoad只会被调用一次,最初应该用于设置视图,而不是用于这种重复逻辑。你可能在某个地方有一个模型对象来保存分数。 (如果不这样做,即如果theScore是ViewController上的实例变量,正如你的代码片段所暗示的那样,你应该将它移动到它自己的模型对象。)最好的方法是让你的ViewController“观察” “使用键值观察保存分数的模型对象。以下是您可以实现的目标:

假设你有以下模型对象来保存你的游戏会话数据(这里只有当前得分):

@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都会自动更新挂锁图像视图的隐藏状态:

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

有关键值观察的完整说明,请参阅此网页:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/KeyValueObserving/

如果不清楚,请告诉我。

答案 1 :(得分:0)

简单的选择是将代码放在viewWillAppear: