2016-07-04 5 views
0

私は3クラスを持っています:
Coreこれはどのクラスからも継承しません。
vcMainおよびvcIncomingFileであり、両方がUIViewControllerから継承される。代理人をSwiftでperformSegueにする方法

私はvcMainからvcIncomingFileまでのセグを持っています。 コアクラスの-performSegueWithIdentifier:メソッドをvcMainvcIncomingの間で呼び出すにはどうすればよいですか。つまり、performメソッドを呼び出すことができるCoreクラスのメソッドやデリゲートなどを、vcMainからvcIncomingFileに渡したいと思っています。 showIncomingVC機能で

class Core { 
    func showIncomingVC(){ } 
} 

、私はvcMainvcIncomingFileperformSegueたい。
おかげ

+0

「コア」はどのようにインスタンス化されていますか? –

+0

コアはネットワーク通信クラスです。 vcAcceptanceと呼ばれる別のクラスでインスタンス化されました。ネットワークからコマンドを送信、分析、および受信します。 –

答えて

0

コアクラスは、あなたのモデルの一部であるか、それが何らかの制御フローメカニズムである場合です。

モデルの一部であれば、View Controllerについては何も知らなくても、View Controllerはアクセスできます。この場合、View Controllerはある種のデリゲートプロトコルを実装し、Coreクラスの一部のコア機能の代理人として自分自身を割り当てることで、Coreクラスからの呼び出しパスを確立することができます。次に、コアは、プロトコルで定義されたメソッドを呼び出すことによって、そのデリゲートで事前定義された動作をトリガすることができます。例えば

あなたはfileReceived(という名前のメソッドでFileEventDelegateと呼ばれるプロトコルを定義した場合)。

次に、FileEventDelegateタイプのfileEventDelegateというメンバーをCoreクラスに追加します。

Coreクラスがファイルを受信するたびに、fileEventDelegate?.fileReceived()を呼び出すことができます。プロトコルを実装しているクラスのオブジェクトインスタンスが、デリゲートとして登録されているオブジェクトインスタンスはそこから処理します。
ユニットテストクラスもデリゲートであり、セグを実行する必要はありません。
デリゲートが設定されていなくてもCoreクラスが機能することさえあります。

UI側では、performSegueWithIdentifier(...)を呼び出すfileReceived()関数を定義して、VcMainクラスでFileEventDelegateプロトコルを実装できます。 viewLoaded()では、それ自身が、動作しているCoreクラスインスタンスのfileEventDelegateとして設定できます。

これは、それが所属するviewController内のすべてのモデルからビジュアルロジックを保持します。

CoreクラスがView Controllerを完全に分離している場合(つまり、View ControllerがCoreのインスタンスへのアクセス方法を知らない場合)、NSNotificationCenterを調べて通知を送信することができますあなたのビューコントローラーが非同期的にピックアップする宇宙。

+0

ありがとうございました。プロトコルとメソッドを定義しました。そしてvcMainのために私はプロトコルを実装し、それをそれに適合させる。 coreにprotocolDelegateのメンバーを追加します。しかし今、どのようにして代議員を登録するのですか?私はこの行を意味しています "プロトコルを実装しているクラスのオブジェクトインスタンスは、デリゲートがそこから処理するように自身を登録しました。" –

+0

ありがとうございました。プロトコルとメソッドを定義しました。そしてvcMainのために私はプロトコルを実装し、それをそれに適合させる。 coreにprotocolDelegateのメンバーを追加します。しかし今、どのようにして代議員を登録するのですか?私はこの行を意味しています "プロトコルを実装しているクラスのオブジェクトインスタンスは、デリゲートがそこから処理するように自身を登録しました。" @ alain-t –

+0

「自分自身を登録する」という前提は、View ControllerがCoreクラスのインスタンスをインスタンス化または検出し、そのfileEventDelegateプロパティをselfに設定できることです。たとえば、コアクラスにシングルトン(たとえばsharedInstanceなどの静的変数)がクラスのインスタンスとともにある場合、vcMainはそのViewDidLoadメソッドでCore.shareInstance.fileEventDelegate = selfを実行できます。 –

0

CoreニーズをperformSegueWithIdentifierがのUIViewController

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/index.html#//apple_ref/occ/instm/UIViewController/performSegueWithIdentifier:senderの関数であるので、UIViewControllerまたはUIViewControllerを継承し、いくつかのクラスであるために:

あなたが代わりにプロトコルで動作することができます。 showIncomingVC funcをして、あなたのコアクラスでプロトコルを作成します(){}とちょうどあなたのビュークラスに

+0

はい、私は、コアをUIViewControllerのサブクラスにすることができますが、MVCパターンは間違っています。私はプロトコルとデリゲートで仕事をしたい。しかし、私は正確にどのようにそれについて調べているのかわかりませんが、いくつかの誤りに直面しています。デリゲートの使い方を説明できますか? Thanks –

+0

上記の答えは、プロトコルとクラスで作業する簡単な方法です。構造体内のストーリーボードで使用した識別子の名前を変更するだけです – kileros

0

をそのデリゲートを使用して、次のように実行します。適切に私たちはあなたのかどうかを知る必要があるだろうパターンを実装するには

struct Segue { 
    let sourceVC: UIViewController 
    let sender: AnyObject 
    let identifier: String 
} 

protocol SegueProtocol: class { 
    var segue: Segue { get } 
} 

class Core { 
    weak var delegate: SegueProtocol? 
    func perform() { 
     guard let segue = delegate?.segue else { 
      return 
     } 
     segue.sourceVC.performSegueWithIdentifier(segue.identifier, sender: segue.sender) 
    } 
} 
+0

ありがとう、struct closure:UIViewController "宣言されていない型の使用" UIViewController "どうすれば解決できますか? –

+0

Inport UIKitを忘れてしまいましたが、エラーが解決しました –

+0

@BehdadAhmadiちょっとインポートUIKit – Lumialxk

関連する問題