0

我正在我的游戏主菜单和游戏本身之间切换,我需要一个加载屏幕。当前的行为是我点击 Play 按钮,几秒钟内没有任何动作和segue,然后游戏开始。

暂时,我只是抛出 aUIActivityIndicatorView并手动告诉它 to startAnimating,然后将 segue 调用到另一个场景。问题是来自游戏视图(segue 的终点)的代码在视图在屏幕上发生物理变化之前正在运行(即我在执行游戏代码时看到菜单)。我不太明白这是怎么发生的,因为微调器被告知在调用 segue 之前显示。这是代码:

- (IBAction) startGame: (id) sender
{
    [_loadingView setHidden: NO];
    [_loadingSpinner startAnimating];
    [self performSegueWithIdentifier: @"PlayGame" sender: self];
}

在 segue 完成之前(即,直到游戏的主视图以完全不同的方式显示在屏幕上ViewController(它正在查询 SQLite 数据库))才调用实际花费时间的东西,那么为什么微调器直到工作之后才显示已经完成?我应该为此使用 GCD 还是类似的?我已经做了一些实验,但它可能比我目前的水平略高。繁重的代码包含在一种方法中,所以我希望能够做这样的事情,按顺序执行这些行。

[spinner startAnimating];
[self callMethodThatTakesAges];
[spinner stopAnimating];

我尝试过使用performSelectorOnMainThread:withObject:waitUntilDone:,但似乎在这两个视图之间感到困惑。理想情况下,微调器应该显示在游戏视图上,而不是菜单视图上,所以我应该点击播放,到游戏视图的转换应该是即时的,然后微调器应该出现,加载应该开始,完成后微调器应该消失。

有任何想法吗?谢谢!

编辑:这是我的游戏视图控制器中的一些方法(makeNewWord是麻烦的方法)。

- (void) viewDidAppear: (BOOL) animated
{
    UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle: UIActivityIndicatorViewStyleWhiteLarge];
    [spinner setCenter: CGPointMake(240, 55)];
    [self.view addSubview: spinner];
    [spinner startAnimating];
    [self makeNewWord];
    [spinner stopAnimating];
    [self becomeFirstResponder];

}

- (void) viewDidLoad
{
    [super viewDidLoad];
    [self canBecomeFirstResponder];

    firstLetterMultiplierLetter = [[NSString alloc] init];
    userIsEnteringAWord = NO;

    [self setUpGestures];
}

这是从我的主菜单视图中调用的方法,该方法进入游戏视图:

- (IBAction) startGame: (id) sender
{
    [self performSegueWithIdentifier: @"PlayGame" sender: self];
}
4

1 回答 1

0

很难从你的问题中看出你在哪里。我会说你想这样做:

1) add the spinner to the game view 
2) in game view viewDidAppear, have [spinner startAnimating];
3) call [self methodThatTakesAges] (as the next line in viewDidAppear).
4) call [spinner stopAnimating] from whatever call back method you have in methodThatTakesAges

startGame: 方法中唯一的东西应该是 performSegue 行。您可能还需要将开始下载的位置更改为我所说的位置,目前尚不清楚您从哪里开始。

于 2013-01-28T00:44:22.737 回答