2013-09-27 7 views
6

SpriteKit должен очищать и приостанавливать все таймеры при нажатии кнопки «домой».Домашний нажатие кнопки вызывает код EXC_BAD_ACCESS = 1 в SpriteKit SKView

Однако мы обнаружили, что если вы нажали кнопку «домой» при отображении активного SKView, приложение выйдет из строя. Это происходит, даже если это представление уже приостановлено пользователем.

Странно, если вы дважды коснитесь кнопки «домой» и перейдете в режим многозадачности, все будет хорошо.

Follow Up Примечание: Тренажер работает отлично в обоих случаях, не краш

Кто-нибудь еще видел этот вопрос с SpriteKit?

Вы нашли причину/решение?

+0

Пожалуйста, будьте более конкретным в том, что вы просите. Вы хотите обходной путь? Исправить? Объяснение? –

+0

Также вы можете задать вопрос на форумах dev. –

+1

У меня такая же проблема. Рад узнать, что это не все в моей голове :) –

ответ

10

У меня была такая же проблема, и я решил его вручную паузы корневой SKView в ViewController перед приложением движущуюся на фоне:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // Configure the view (already setup as SKView via storyboard) 
    SKView * skView = (SKView *)self.view; 

    // Create and configure the scene. 
    SKScene *scene = [Menu sceneWithSize:CGSizeMake(skView.bounds.size.height, skView.bounds.size.width)]; 
    scene.scaleMode = SKSceneScaleModeAspectFill; 

    // Present the scene. 
    [skView presentScene:scene]; 
    [[NSNotificationCenter defaultCenter] 
    addObserver:self 
    selector:@selector(appWillEnterBackground) 
    name:UIApplicationWillResignActiveNotification 
    object:NULL]; 
} 

- (void)appWillEnterBackground 
{ 
    SKView *skView = (SKView *)self.view; 
    skView.paused = YES; 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    [[NSNotificationCenter defaultCenter] 
    addObserver:self 
    selector:@selector(appWillEnterForeground) 
    name:UIApplicationWillEnterForegroundNotification 
    object:NULL]; 
} 

- (void)appWillEnterForeground 
{ 
    SKView * skView = (SKView *)self.view; 
    skView.paused = NO; 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    [[NSNotificationCenter defaultCenter] 
    addObserver:self 
    selector:@selector(appWillEnterBackground) 
    name:UIApplicationWillResignActiveNotification 
    object:NULL]; 
} 
+0

просто использовал это и отлично работает! спасибо – BSevo

+0

Это определенно более распространенная проблема, с которой люди будут иметь ... поэтому я ее принял. – MobileVet

+1

Ответ Tanzolone замечательный, однако, если вы потянете Центр уведомлений, приложение остановится, но оно не будет отменено, если вы вернете Центр уведомлений. У меня просто была эта проблема, и я подумал, что это может быть так: «Найти» - (void) AppWillEnterBackground «изменить» имя: UIApplicationWillEnterBackground «to» name: UIApplicationDidBecomeActiveNotification " –

0
  1. Запустите анализатор Xcode (Project> Analyze), чтобы определить, есть ли у вас проблемы с управлением памятью в коде.

  2. Запустите этот сценарий в инструменте распределения приложения «Инструменты» («Проект»> «Профиль»), который может сообщать о любом обнаруженном неправильном использовании памяти.

0

Мы столкнулись с каким-то подобным непоследовательным поведением с UICollectionView. В этом случае создание экземпляра объекта с помощью раскадровки (по сравнению с программным) разрешило проблему.

На догадках я пробовал это сегодня утром и Виолу, успех!

Итак, похоже, что раскадровки делают магию с помощью SKView при создании, которое нам неизвестно, и позволяет им правильно заканчиваться нажатием кнопки Home Button. Разочарование, но по крайней мере это работает сейчас.

+0

Кроме того, установка FPS для SKView работает только в том случае, если вы создаете экземпляр представления в раскадровке – MobileVet

+0

Дополнительная информация, это может быть вызвано нашим вызовом «init» вместо «initWithCoder» или «initWithFrame», и они, похоже, работают правильно. – MobileVet

0

Проблема может быть вызвана аудио, если так что вы можете проверить ответ здесь https://stackoverflow.com/a/19283721/1278463

Я решил это в игре, которая не использует аудио. Th решение заключается в том, чтобы приостановить SKView при вводе фона:

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    SKView *view = (SKView *)self.window.rootViewController.view; 
    if (view) { 
     view.paused = YES; 
    } 
} 

- (void)applicationWillEnterForeground:(UIApplication *)application 
{ 
    SKView *view = (SKView *)self.window.rootViewController.view; 
    if (view) { 
     view.paused = NO; 
    } 
} 
Смежные вопросы