Swift。在 ViewController 之间转换而不在返回时关闭它们

Swift. Transition between ViewControllers without dismissing them on going back

我正在尝试构建一个与 iTunes 具有相同导航结构的应用程序。

当用户单击 "Now Playing"(第 3 个 window)按钮时,应打开第 2 个 ViewController(假设第 2 个 window)。当用户返回到之前的 ViewController 时,应用程序应该能够保持 SecondViewController 活动(音乐在后台播放)以便随时从任何 ViewController.

如何使用导航或任何其他控制器制作这样的层次结构? 希望问题很清楚。

您应该将视图控制器视为:管理 视图 的控制器。您将功能(播放特定歌曲)绑定到用户界面视图(查看其图片、时间、音量)。

因此,您的层次结构问题不是要问的正确问题。您应该考虑如何制作一个 class(最好是单例,称之为 CurrentlyPlayingMusic)来管理当前播放的音乐,并且当用户界面需要显示当前播放的音乐时,它会加载SecondViewController 来自您的示例,此时从 CurrentlyPlayingMusic 请求显示所需内容所需的数据和元数据:歌曲名称、艺术家、时间等...

CurrentlyPlayingMusic 应该是一个单例,一旦实例化,就会驻留在内存中并正确播放音乐。任何时候你需要知道发生了什么,或者你需要对当前播放的音乐采取行动 (start/stop/etc...),你查询 CurrentlyPlayingMusic。从某种意义上说,它是 AVAudioPlayer 的轻量包装器,还可以让您放入自己想要在音乐生命周期中保留的属性。

听从@Rikkles 的建议。

要专门添加到您的问题中,您应该查看模型-视图-控制器结构。 http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

关于视图,您需要做的是为您想要的每个视图设置一个 UIViewController。然后,当您希望另一个视图出现在顶部时,您可以在另一个视图上显示一个 UIViewController:

ROOT_VIEW_CONTROLLER.presentViewController(controller, animated: true, completion: {})

并关闭它

ROOT_VIEW_CONTROLLER.dismissViewControllerAnimated(true, completion: nil)

有关 UIViewController 的完整文档请看这里(非常值得一读): https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/ModalViewControllers/ModalViewControllers.html