Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 为什么我的UILabel不显示NSInteger_Iphone_Objective C - Fatal编程技术网

Iphone 为什么我的UILabel不显示NSInteger

Iphone 为什么我的UILabel不显示NSInteger,iphone,objective-c,Iphone,Objective C,我有一个ViewController和GameController类,它只是NSObject的子类。视图控制器有一个链接到它的按钮,并触发一个初始化GameController类的iAction。GameController类的init中有一个CADisplayLink,它将一个添加到名为score的int中。在调试器中,分数将上升,但标签将仅显示0 在视图控制器中 -(void)setScore:(NSInteger)gameScore{ NSString *string = [NSStrin

我有一个ViewController和GameController类,它只是NSObject的子类。视图控制器有一个链接到它的按钮,并触发一个初始化GameController类的iAction。GameController类的init中有一个CADisplayLink,它将一个添加到名为score的int中。在调试器中,分数将上升,但标签将仅显示0

在视图控制器中

-(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;
}
-(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];
}
}
游戏控制器中

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

通常,当调试器正确获取信息但UI未更新时,是因为更新UI的操作未在主线程上执行。试试这个:

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

通常,当调试器正确获取信息但UI未更新时,是因为更新UI的操作未在主线程上执行。试试这个:

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

%i
是无效的格式说明符;对有符号32位整数使用
%d
,或对无符号32位整数使用
%u
%i
是无效的格式说明符;对有符号的32位整数使用
%d
,或对无符号的32位整数使用
%u
,您尝试过吗

NSLog(@"the score is %lu", gameScore);
它应该适合你。

你试过了吗

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

它应该适合您。

在GameCenter中,游戏分数为long-long-int类型,因此在方法中使用long-long,如果在任何地方使用,则返回类型。 当你想让它在标签上使用

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

在GameCenter中,游戏分数为long long int类型,因此在方法中使用long long,如果在任何地方使用,则返回类型。 当你想让它在标签上使用

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

分数没有更新,因为您正在游戏控制器中创建新的view controller实例,您需要以某种方式将view controller的对象传递给游戏控制器,然后使用相同的对象调用方法setScore。

分数没有更新,因为您正在游戏控制器中创建新的view controller实例,您需要将view controller的对象传递给game controller,然后使用相同的对象调用方法setScore。

仔细查看您的代码。您的ViewController的“-play:”方法创建一个新的游戏控制器。游戏控制器的'-init'创建一个新的ViewController。这真的是你想要的吗

您并没有给我们提供太多的信息,但似乎您的游戏控制器或视图控制器都应该“负责”,并创建另一个实例的一个实例。这里大约有一百万个问题与如何让一个对象向另一个对象发送数据有关,但它们都归结为:要将信息从对象a传递到对象b,a需要一个指向b的指针。然后,A可以使用该指针向b发送消息


例如,视图控制器创建游戏控制器。这意味着视图控制器有一个指向游戏控制器的指针,它可以使用实例变量或属性来保存该指针。如果游戏控制器需要将消息发送回视图控制器,则需要指向视图控制器的指针。视图控制器可以在创建游戏控制器时或之后的某个时间点提供该指针(指向自身)。为了实现这一点,游戏控制器需要一种能够接受指向视图控制器的指针的方法。也许您决定在创建时执行此操作,因此您将游戏控制器的initialize toon方法更改为“-initWithDelegate:(id)”,定义GameControllerDelegate协议,然后在ViewController类中采用该协议。您应该这样做,而不仅仅是使用“-initWithViewController:(ViewController*)”,因为它的良好风格可以防止GameController依赖于帮助它的对象的特定类——GameController可能只关心它的帮助器实现一些方法,它不需要知道它的助手是ViewController。

仔细查看代码。您的ViewController的“-play:”方法创建一个新的游戏控制器。游戏控制器的'-init'创建一个新的ViewController。这真的是你想要的吗

您并没有给我们提供太多的信息,但似乎您的游戏控制器或视图控制器都应该“负责”,并创建另一个实例的一个实例。这里大约有一百万个问题与如何让一个对象向另一个对象发送数据有关,但它们都归结为:要将信息从对象a传递到对象b,a需要一个指向b的指针。然后,A可以使用该指针向b发送消息


例如,视图控制器创建游戏控制器。这意味着视图控制器有一个指向游戏控制器的指针,它可以使用实例变量或属性来保存该指针。如果游戏控制器需要将消息发送回视图控制器,则需要指向视图控制器的指针。视图控制器可以在创建游戏控制器时或之后的某个时间点提供该指针(指向自身)。为了实现这一点,游戏控制器需要一种能够接受指向视图控制器的指针的方法。也许您决定在创建时执行此操作,因此您将游戏控制器的initialize toon方法更改为“-initWithDelegate:(id)”,定义GameControllerDelegate协议,然后在ViewController类中采用该协议。您应该这样做,而不仅仅是使用“-initWithViewController:(ViewController*)”,因为它的良好风格可以防止GameController依赖于帮助它的对象的特定类——GameController可能只关心它的帮助器实现一些方法,它不需要知道它的助手是ViewController。

%i、%d和%u都不更新标签%i但告诉我NSLog中有多少分数。%i、%d和%u都不更新标签%i但告诉我NSLog中有多少分数。如果我替换[ViewController setScore:score];尽管如此,它仍然不会更新对不起:/i如果我替换[viewController setScore:score];尽管如此,它仍然不会更新对不起:/iOS当前运行的所有设备都是32位的