如何在iOS故事板中将对象初始化为Singleton

时间:2016-08-06 15:55:34

标签: ios singleton uistoryboard

您能告诉我如何在iOS故事板中初始化Singleton吗?到目前为止,我的理解是标准模式在我们希望成为单例的类中看起来像这样,并且此代码有效:

class var sharedInstance: LibraryAPI {
    struct Singleton {
        static let instance = LibraryAPI()
    }
    return Singleton.instance
}

相同的模式不适用于MusicPlayer: enter image description here

我正在制作一个依赖AVPlayer播放音频的自定义MusicPlayer对象。我希望这个MusicPlayer在应用程序激活后立即存在。目前,MusicPlayer是在Storyboard中创建的,允许我使用IBOutlets和IBActions将按钮和标签连接到MusicPlayer。挑战是当我导航到viewController堆栈时,MusicPlayer被释放。如下图所示。

enter image description here

我可以覆盖哪些方法来查看故事板何时创建和销毁MusicPlayer?到目前为止,您可以看到重写init()被调用但是deinit不是。我没有运气在文档或网上找到答案。

有可能有更好的方法来设计这个应用程序。我认为Singleton很有意义,因为应该只有一个MusicPlayer。只有它的状态会在应用程序的整个生命周期中发生变化。

感谢您的建议。

1 个答案:

答案 0 :(得分:1)

class var sharedInstance: LibraryAPI {
    struct Singleton {
        static let instance = LibraryAPI()
    }
    return Singleton.instance
}

这看起来非常复杂。您通常可以使用:

final class MusicPlayer {
    let sharedInstance = MusicPlayer()
    init() {}
}

如果Something不是final,事情确实会变得复杂一些,但通常它可以用于单身人士。

  

目前,MusicPlayer在故事板中创建,允许我使用IBOutlets和IBActions将按钮和标签连接到MusicPlayer。

这不会奏效。有关我的问题版本,请参阅rdar:25450179。 Apple的最新解释是,这可能无法修复。这需要对Storyboard进行过多的重新设计。他们可能会改变主意,但这是一个很大的改变。

你最接近的就是通过你的班级揭露单身人士。

class MyClass: UIViewController {
    var musicPlayer: MusicPlayer { return MusicPlayer.sharedInstance() }
}

但这可能也不会做你想做的事情。通常,您需要将IBOutlet直接绑定到视图控制器。然后,视图控制器可以根据需要代理其他对象。