2016-08-06 15 views
0

iOSストーリーボードでシングルトンを初期化する方法を教えてください。私の理解では、これまでの標準的なパターンは、我々はシングルトンになりたいと、このコードが動作するクラス内でこのようになっていることである。iOSストーリーボードでオブジェクトを初期化する方法シングルトン

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

同じパターンがMusicPlayerのために動作しません: enter image description here

私はオーディオを再生するためにAVPlayerに依存するカスタムのMusicPlayerオブジェクトを作成しています。私は、このMusicPlayerが、アプリケーションが起動するとすぐに存在してほしいです。現在、MusicPlayerはストーリーボードに作成されており、IBOutletsとIBActionsを使用してボタンとラベルをMusicPlayerに接続することができます。私がviewControllerスタックをバックアップすると、MusicPlayerの割り当てが解除されます。下図のようになります。

enter image description here

どの方法私は、ストーリーボードを作成し、MusicPlayerを破壊したときに表示するためにオーバーライドすることができますか?これまでのところ、init()のオーバーライドは呼び出されていますが、deinitは呼び出されていません。私はドキュメントやオンラインで答えを見つけ出すことができません。

このアプリを設計するより良い方法がある可能性があります。私はシングルトンが理にかなっていると思うのは、ただ1つのMusicPlayerがあるべきだからです。その状態だけがアプリの存続期間を通じて変化します。

ありがとうございました。

答えて

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

これは非常に複雑すぎるようです。あなたは、一般的にだけ使用することができます。

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

物事はSomethingfinalない場合はもう少し複雑になりませんが、通常は、シングルトンのためにすることができます。

ストーリーボードでは、IBOutletsとIBActionsを使用してボタンとラベルをMusicPlayerに接続できるようにMusicPlayerが作成されています。

これは機能しません。私の問題のバージョンについては、rdar:25450179を参照してください。アップルの最新の説明はこれが修正されていない可能性があるということです。ストーリーボードをあまりにも多く再設計する必要があります。彼らは心が変わるかもしれませんが、それは大きな変化です。

最も近いことは、あなたのクラスにシングルトンを公開することです。

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

しかし、これはおそらくあなたが望むことをするつもりはありません。一般的には、IBOutletsを直接View Controllerに結びつける必要があります。ビューコントローラは、必要に応じて他のオブジェクトにプロキシすることができます。

関連する問題