Ios 将一个视图标签的内容发送到另一个视图标签时获取(NULL)

Ios 将一个视图标签的内容发送到另一个视图标签时获取(NULL),ios,objective-c,uiviewcontroller,Ios,Objective C,Uiviewcontroller,我一直在尝试创建一个记分系统,一旦计时器结束,就会出现一个新的视图并打印出最终的分数。当我跑步时,我的计时器工作正常,当我得到正确答案时,初始分数也正常。但是,当我尝试将第二个视图控制器的视图最终分数标签更新为计时器达到0后收到的最后一个分数时,第二个视图控制器的最终分数标签会打印出一个0,或者如果我将其更改为字符串a(null) 下面是我的代码,您可以看到发生了什么 FirstViewController.m 好的,基本上我总结了以下四种方法: timerRun(保存时间循环和结束时间的条件)

我一直在尝试创建一个记分系统,一旦计时器结束,就会出现一个新的视图并打印出最终的分数。当我跑步时,我的计时器工作正常,当我得到正确答案时,初始分数也正常。但是,当我尝试将第二个视图控制器的视图最终分数标签更新为计时器达到0后收到的最后一个分数时,第二个视图控制器的最终分数标签会打印出一个0,或者如果我将其更改为字符串a(null)

下面是我的代码,您可以看到发生了什么

FirstViewController.m

好的,基本上我总结了以下四种方法:

  • timerRun(保存时间循环和结束时间的条件)

  • setTimer(基本上将计时器设置为初始长度)

  • detectDrawing(此项检测图形识别,如果它与提供的模板匹配,则为分数标签提供GAME_分数或GAME_分数加成。一旦他们获得分数)

  • viewDidLoad(基本上调用我的计时器,并最初将gameScore设置为0)

  • 现在我不想给每个人带来太多无用的代码,但是我打电话的原因是 [查看显示]方法在分数确定后,每次都会循环我的游戏,直到时间结束

    好的,对不起,风太大了

    -(void)timerRun
    {
    self.secondsCount--;
    int seconds = self.secondsCount;
    
    NSString *timerOutput = [NSString stringWithFormat:@"%i",seconds];
    self.timerLabel.text = timerOutput;
    
    if(self.secondsCount == 0)
    {
    [self.gameCountDownTimer invalidate];
    
    
    self.objSecondView = [[SecondViewController alloc]initWithNibName:@"SecondViewController." bundle:nil];
    
    self.finalScore =self.gameScore;
    
    NSLog(@"THE FINAL_CURRENT SCORE IS %d!!!!!!!!!!!!!",self.finalScore);
    
    [self performSegueWithIdentifier:@"secondViewScreen" sender:self];
    
    
    }
    
    
    
    }
    
    -(void)setTimer
    {
    self.secondsCount = TIMER_LENGTH;
    self.gameCountDownTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerRun) userInfo:nil repeats:YES];
    
    }
    - (void)DetectDrawing:(DrawingGameGlyphDetectorView*)theView glyphDetected:(WTMGlyph *)glyph withScore:(float)score
    {
    NSNumber *number = [[NSNumber alloc]initWithInt:10];
    
    if (score < GESTURE_SCORE_THRESHOLD)
    return;
    else if([glyph.name isEqualToString:convertAnswer])
    {
    NSLog(@"WOOOOOOOO!HOOOOOO!~~~");
    
    self.gameScore += GAME_SCORE;
    
    if(self.answer > number)
    {
    self.gameScore += GAME_SCORE_BONUS;
    
    }
    self.scoreLabel.text = [NSString stringWithFormat:@"Score:%i",self.gameScore];
    self.objSecondView.finalScore = self.scoreLabel.text;
    [self viewDidAppear:YES];
    }
    
    }
    
    - (void)viewDidLoad
    {
    [self setTimer];
    self.gameScore = 0;
    
    
    [super viewDidLoad];
    }
    

    您不需要分配新的“SecondViewController”。塞格会帮你的。 基本上,您不希望有从一个ViewController到另一个ViewController的引用。这很可能会产生保留周期

    您需要做的只是:

    - (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
      SecondViewController *dest = [segue destinationViewController];
      dest.finalScoreText.text = [NSString stringWithFormat:@"%i",self.gamescore];
    }
    

    嗯,我还是不能让它不显示0。只要确保,我将prepareForSegue方法放在我的FirstViewController中,我是否需要在第二个ViewController中调用任何东西?我试图阅读有关该方法的文档,想知道是否需要在整个故事板中设置segue。
    - (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
      SecondViewController *dest = [segue destinationViewController];
      dest.finalScoreText.text = [NSString stringWithFormat:@"%i",self.gamescore];
    }