2016-03-20 8 views
0

私はビューコントローラ間でスワイプナビゲーションを処理して実装するクラスのインスタンスを持っています。私は別のビューコントローラへのスワイプナビゲーションをシミュレートできるメソッドをこのクラスに持っています。インスタンスを作成せずに別のクラスのメソッドを呼び出す

完璧なシナリオでは、IBのビューコントローラにボタンを追加し、そのアクションコールでハンドラクラスのメソッドを呼び出して、他のビューコントローラに移動します。

私はインスタンスを再作成しようとしているようですが、明らかに他のインスタンスにあるすべての情報を持っていないため動作しません。

また、ハンドラクラス自体からボタンのサブビューをビューコントローラに追加しようとしましたが、うまくいきましたが、もっときれいな方法があるかどうかを知りたかったのです。

メソッドを呼び出すために、他のView Controllerから既に存在するクラスのインスタンスにアクセスすることはありますか?

私はswipe().navigateToLeftVC()を試しましたが、インスタンスが再作成されました。

+0

私は、最初のインスタンスがアプリケーションデリゲートで作成され、window.rootviewcontrollerに割り当てられていることに気付きました。これは助けになるだろうか?ありがとうございました – Walking

+1

多分あなたはこのようなインスタンスの値を持つグローバル変数を作成することができます: 'let myInstance = myClass()'そしてあなたの関数を呼び出す必要があるときはいつでもそのインスタンスを参照してください。そのインスタンスはグローバルスコープで定義されているので、どこからでも参照できます。また、グローバル変数の代わりにシングルトンを作成することもできます。 – Harish

+0

また、各ビューコントローラ – Shades

答えて

1

シングルトンを作成することでこれを解決しました。

は、私は私のシングルトンインスタンスを返し、私はcontrollerName.sharedManagerを使用し、ルートビューコントローラにそれを割り当てられた私のアプリデリゲートに続いて、私のコントローラ

class var sharedManager: controllerName { 
     struct Static { 
      static let instance = controllerName() 
     } 
     return Static.instance 
    } 

にこのコードを追加しました。

次に、他のビューコントローラで、そのクラスのメソッドを呼び出すときに、私はcontrollerName.sharedManager.methodName()を使用しました。

完全に動作します。

+1

にインスタンスを渡すこともできますが、これはこのアプリケーションでうまくいくかもしれませんが。実際には、View Controllerの不要なインスタンスを作成しないでください。このアプローチでは、* controllerName()*クラスの2つのバージョンが用意されています。これにより、後で回線の予期しない問題が発生する可能性があります。私はあなたのためのいくつかの可能な選択肢があります。ナビゲーションコントローラを使用していますか? –

+1

確かに*完璧な言葉はここでは伸縮です。これは決して完璧な解決策ではありません。うまくいくかもしれない。しかし実際には、これは理想的な解決策ではありません。実際のコードで何が起こっているのかをさらに見て、なぜこれが必要だと感じるのかを理解する必要があります。 – nhgrif

+0

あなたの知識を共有してくれてありがとう。 @nhgrif:私はビューコントローラを介してサイドスワイプを実装するクラス(EZSwipeController)を持っています。それは私のアプリケーションに適合しないので私が使用していないナビゲーションコントローラの実装が付属しています。そこで、私は、ビューコントローラをスワイプし、ボタンアクションをナビゲートできるようにするために、EZSwipeControllerライブラリのメソッドを呼び出すビューコントローラ内にボタンを持つことができる方法が必要でした。私が1つしかインスタンス化していない場合、私は2つのバージョンのcontrollerNameをどのように持っているのか説明できますか? – Walking

関連する問題