2012-10-01 50 views
0

我有一個ViewController和GameController類,它只是從NSObject子類。視圖控制器有一個按鈕鏈接到它並觸發一個位於GameController類中的IBAction。在GameController類的init中有一個CADisplayLink,它將一個int加入到一個名爲score的int中。在調試器中的得分上升,但標籤將在GameController爲什麼通過我的UILabel顯示一個NSInteger

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

在ViewController中只顯示爲0。

-(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

你在哪裏添加'viewController'的視圖? –

回答

1

仔細看看你的代碼。你的ViewController的'-play:'方法創建一個新的GameController。你的GameController的'-init'創建一個新的ViewController。那真的是你想要的嗎?

您還沒有給我們太多的東西,但是您的遊戲控制器或視圖控制器應該是「負責」並創建另一個實例。這裏有大約一百萬個關於如何讓一個對象向另一個對象發送一些數據的問題,但是他們都歸結爲:要將信息從對象a傳遞給對象b,需要一個指向b的指針。然後A可以使用該指針向b發送消息。

因此,例如,您的視圖控制器創建遊戲控制器。這意味着視圖控制器有一個指向遊戲控制器的指針,它可以使用一個實例變量或屬性來保存它。如果遊戲控制器需要將消息發送回視圖控制器,則需要一個指向視圖控制器的指針。視圖控制器可以在創建遊戲控制器時或之後的某個點提供該指針(自身)。爲了促進這一點,遊戲控制器需要一種方法來接受指向視圖控制器的指針。也許你決定在創建時這樣做,所以你將遊戲控制器的initialize toon方法更改爲'-initWithDelegate:(id)',定義一個GameControllerDelegate協議,然後在你的ViewController類中採用該協議。你會這樣做,而不是僅僅使用'-initWithViewController:(ViewController *)',因爲它的良好風格防止GameController依賴於幫助它的對象的特定類 - GameController可能只關心其助手實現了幾個方法,它不需要知道它的助手是一個ViewController。

+0

謝謝!我是個傻子。我在IBAction中寫了play [self setScore:gameController.score];並更新了分數。非常感謝你。 – anonamousUsername

0

通常情況下,當調試正常,但用戶界面獲取信息不更新是因爲更新UI的操作不在主線程上執行。試試這個:

dispatch_async(dispatch_get_main_queue(), ^{ [viewController setScore:score]; }); 
+0

如果我替換[viewController setScore:score];與它,但它仍然不會更新對不起:/ – anonamousUsername

0

%i是無效的格式說明;使用%d爲有符號的32位整數或%u爲無符號的32位整數

+0

%我,%d和%u都不更新標籤%我告訴我在NSLog中得分有多高。 – anonamousUsername

+0

對於'printf'格式字符串,'%i'和'%d'是同義詞。 –

0

你試過了嗎?

NSLog(@"the score is %lu", gameScore); 

它應該爲你工作。

+0

iOS當前運行的所有設備都是32位。 https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Cocoa64BitGuide/64BitChangesCocoa/64BitChangesCocoa.html#//apple_ref/doc/uid/TP40004247-CH4-SW2 – kamleshwar

+0

對於Unsigned,您可以使用@「%lu」爲NSInteger @「%ld」 – kamleshwar

1

在GameCenter中,遊戲得分的類型是long long int,所以在你的方法中使用long long並且在任何地方使用返回類型。 當你想因此它在標籤上使用

yourLabel.text = [NSString stringWithFormat:@"%lld",yourscore]; 
2

得分沒有更新,因爲你正在創建遊戲控制器視圖控制器的新實例,你不知何故需要通過視圖控制器的目的是,遊戲控制器,然後使用相同的對象來調用方法setScore。

+0

你不知道有什麼辦法可以做到嗎? – anonamousUsername

相關問題