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

时间:2013-11-24 16:25:49

标签: ios objective-c uiviewcontroller

如果这段代码看起来很混乱,我对iPhone的编程很新,对我来说是如此。 基本上我一直试图创建一个分数系统,一旦计时器结束,出现一个新视图并打印出最终分数。我的计时器在我跑步时正常工作,初始得分也是如此,因为我得到了正确的答案。但是,当我尝试将我的第二个视图控制器的视图最终得分标签更新为计时器命中0后收到的最后一个得分时,我的第二个视图控制器的最终得分标签打印出0或者如果我将其更改为字符串a(null) 。对任何回应的人我都很感激。

以下是我的代码,以便您了解正在发生的事情。

FirstViewController .m

好的,基本上总结下面我有4种方法:

  1. timerRun(保存时间循环和结束时间的条件),

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

  3. detectDrawing(这个检测绘图识别,如果匹配提供的模板,则会给分数标签一个GAME_SCORE或GAME_SCORE BONUS分数。一旦得到分数)

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

  5. 现在我不想给每个人带来太多无用的代码,但我接下来打电话的原因 得分之后的[viewDidAppear]方法每次都会循环我的游戏,直到时间结束。

    对不起长长的风。

    -(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.m:

     -(void)viewWillAppear:(BOOL)animated
        {
    
    self.objFirstView = [[FirstViewController alloc]initWithNibName:@"FirstViewController."    bundle:nil];
    
    self.finalScoreText.text = [NSString stringWithFormat:@"%i",self.objFirstView.finalScore];
    
        NSLog(@"NEW VIEW!!!!!! AND THE  FINAL SCORE IS!!!! %i",self.objFirstView.finalScore);
    
        }
    

1 个答案:

答案 0 :(得分:0)

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

您需要做的就是:

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