我有一个ViewController和GameController类,它只是NSObject的子类。视图控制器有一个链接到它的按钮,并触发一个进入GameController类的IBAction。在GameController类的init中是一个CADisplayLink,它将一个添加到一个名为score的int中。在调试器中,分数会上升,但标签只会显示0。
ViewController中的
-(void)setScore:(NSInteger)gameScore{
NSString *string = [NSString stringWithFormat:@"%i", gameScore];
scoreLabel.text = string;
NSLog(@"the score is %i", gameScore);
}
-(IBAction)play:(id)sender{
gameController = [[GameController alloc] init];
//in my header is GameController* gameController;
}
GameController中的
-(id)init{
self = [super init];
if (self) {
viewController = [[ViewController alloc] init];
//in header ViewController* viewController;
displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(gameLoop:)];
[displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode: NSRunLoopCommonModes];
//in the header CADisplayLink* displayLink;
}
return self;
}
-(void)gameLoop:(CADisplayLink *)sender{
deltaScore++;
if (deltaScore >= 20) {
deltaScore -= 20;
score++;
//deltaScore and score are NSIntegers
[viewController setScore:score];
}
}
答案 0 :(得分:2)
得分未更新,因为您在游戏控制器中创建新的视图控制器实例,您需要以某种方式将视图控制器的对象传递给游戏控制器,然后使用相同的对象来调用方法setScore。
答案 1 :(得分:1)
在GameCenter中,游戏得分是long long int类型,所以在你的方法中使用long long,如果在任何地方使用,则返回类型。 如果你想在标签上使用
yourLabel.text = [NSString stringWithFormat:@"%lld",yourscore];
答案 2 :(得分:1)
仔细查看您的代码。您的ViewController的'-play:'方法创建一个新的GameController。你的GameController的'-init'创建了一个新的ViewController。这真的是你想要的吗?
你没有给我们太多的东西,但似乎你的游戏控制器或你的视图控制器应该“负责”并创建另一个的一个实例。这里有大约一百万个关于如何让一个对象将一些数据发送到另一个对象的问题,但它们都归结为:将信息从对象a传递到对象b,需要指向b的指针。然后,A可以使用该指针向b发送消息。
因此,例如,您的视图控制器会创建游戏控制器。这意味着视图控制器有一个指向游戏控制器的指针,它可以使用实例变量或属性来保存它。如果游戏控制器需要将消息发送回视图控制器,则需要一个指向视图控制器的指针。视图控制器可以在创建游戏控制器时或之后的某个时刻提供该指针(自身)。为了方便,游戏控制器需要一种可以接受指向视图控制器的指针的方法。也许您决定在创建时执行此操作,因此您将游戏控制器的initialize toon方法更改为'-initWithDelegate:(id)',定义GameControllerDelegate协议,然后在ViewController类中采用该协议。你不是只使用'-initWithViewController :( ViewController *)'而是为了防止GameController依赖于帮助它的对象的特定类的好方式 - GameController可能只关心它的助手实现了一些方法,它不需要知道它的助手是一个ViewController。
答案 3 :(得分:0)
通常,当调试器正确获取信息但UI未更新时,因为未在主线程上执行更新UI的操作。试试这个:
dispatch_async(dispatch_get_main_queue(), ^{ [viewController setScore:score]; });
答案 4 :(得分:0)
%i
是无效的格式说明符;使用%d
表示有符号的32位整数或%u
表示无符号的32位整数
答案 5 :(得分:0)
你试过吗?
NSLog(@"the score is %lu", gameScore);
它应该适合你。