SpriteKit游戏执行segue后无法与menu viewcontroller交互问题求助
问题根因
- 代码执行逻辑冲突:
performSegueWithIdentifier属于异步操作,触发后不会立刻完成页面切换,你紧接着执行performClose销毁当前窗口,会导致第一次跳转时上下文刚好生效,第二次进入游戏再返回后,菜单视图控制器的响应链被未正常销毁的旧游戏场景、视图控制器实例阻塞,或是菜单视图被残留的透明游戏层覆盖,无法接收交互事件。 - 多余的窗口关闭操作完全没必要:你已经通过segue实现页面跳转,额外关闭窗口会破坏App的视图层级结构,多次进出游戏后就会出现层级冲突。
修复方案
- 优先删除多余的窗口关闭代码,仅保留segue跳转逻辑即可:
[self.view.window.contentViewController performSegueWithIdentifier:@"endGame" sender:self];
- 跳转前主动清理当前SKScene的残留资源,避免内存泄漏和层级残留:
// 清理当前场景的所有动作、节点 [self removeAllActions]; [self removeAllChildren]; // 解绑当前SKScene与视图的关联 [self.view presentScene:nil]; // 再执行跳转 [self.view.window.contentViewController performSegueWithIdentifier:@"endGame" sender:self];
- 避免用即将销毁的上下文触发segue,改为从App根控制器发起跳转,保证执行上下文有效:
NSViewController *rootVC = [NSApplication sharedApplication].keyWindow.contentViewController; [rootVC performSegueWithIdentifier:@"endGame" sender:self];
- 如果问题依然存在,可以通过Xcode的「Debug View Hierarchy」工具查看返回菜单后的视图层级,确认是否有未正常销毁的游戏视图覆盖在菜单上方,如果存在则需要在跳转前主动dismiss当前游戏视图控制器,再执行segue。
内容的提问来源于stack exchange,提问作者Jobalisk
相关产品推荐
相关产品推荐

