我的主类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被“未按下”时工作? (不确定术语)
答案 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:
。