2016-05-06 6 views
0

私のプロジェクトは2度のUIViewControllersを一度に表示しているので、1つのデリゲートで2つの異なるUIViewControllerを登録したいという状況に遭遇しました。イベントをトリガーすると、両方のコントローラーに通知する必要がありますが、どちらのコントローラーしか両方のイベントを受信することはできません。ここで複数のコントローラを持つ単一のデリゲート

はサンプルコードです:

@objc protocol DownloaderDelegate: class { 
    func complete() 
} 

class Downloader { 
    static let sharedInstance = Downloader() 
    weak var delegate: DownloaderDelegate? 

    private init() { 

    } 

    func downloadFile() { 
     self.delegate!.complete() 
    } 
} 

私は、両方のUIViewControllersでこのようにそれを使用しています:

override viewDidLoad() { 
    super.viewDidLoad() 

    Downloader.sharedInstance.delegate = self 
} 

ビューコントローラの両方を単一のデリゲートからのイベントに耳を傾けるようにする方法任意のアイデア?

答えて

5

実際、デリゲートパターンから通知パターン(Appleのドキュメントの詳細:https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/Notification.html)に移行するのが最善のソリューションだと思います。

もう一つの解決策は、デリゲートをDownloaderDelegateの配列で置き換えることです。しかし、私は本当に通知ソリューションが最もクリーンでシンプルだと思っています。ここで

はスウィフトでNSNotificationに良い記事です:https://www.andrewcbancroft.com/2014/10/08/fundamentals-of-nsnotificationcenter-in-swift/

編集: あなたがオブザーバー除去の世話をする必要があります。そうするための最も簡単な方法は、イベントのために、各クラスのリスニングでこれを追加することです:

​​
+0

提案していただきありがとうございます。 'callbacks'を使うのはどうですか?このNSNotificationはまた、観察者を取り除く特別な注意を必要とするため。 – codelearner

+0

'callbacks'は解決策かもしれませんが、' NSNotification'より単純ではないと思います。オブザーバーを削除するには、 'deinit'メソッドで NSNotificationCenter.defaultCenter()。removeObserver(self)'を実行するだけです。 –

+0

あなたはダウンロードを行っているように見えることを考慮すると、ダウンロードの完了を知りたいと思うことがあるかもしれないと考えている場合、通知があなたの最善の選択肢かもしれません。 – PeejWeej

1

これは単一の属性なので、そこに存在できるものは1つだけです。複数のVCが何かに反応するようにするには、さまざまなオプションがあります。デリゲートの配列を持ち、通知を購読したり、通知を送信したり、2つの他のVCを管理するコンテナVC、または他の多くのアプローチを使用できます。

+0

インスタンスは、指定された時間に1つのオブジェクトに対してのみデリゲートとして機能することができますか? – harshitgupta

+0

提案していただきありがとうございます。 'callbacks'を使うのはどうですか? – codelearner

+0

@harshitgupta "delegate"は他の属性と同様にクラスの属性です。一度に1つしか属性を持つことができないようにすることができます。 – PeejWeej

0

いいえ、そのことはできません。このように考える。ダウンローダクラスには 'delegate'というプロパティがあります。このプロパティは、一度に1つのインスタンスへの参照しか保持できません。したがって、インスタンスのメソッド、つまり(最後に割り当てられた値)を参照する 'デリゲート'のメソッドのみが呼び出されます。

@Onejjy氏によると、Notificationsはそれを達成するための良い方法です。

しかし、デリゲートパターンのみを使用したい場合は、私は、ダウンローダclss(デリゲートプロパティ)に2つのプロパティを配置し、それに応じて割り当てると言うでしょう。次に、必要に応じて「呼び出すデリゲートメソッド」コードを複製します。

関連する問題