画面遷移の方法には通常navigationControllerによる遷移があるかと思われます。
あるプログラムを複数のモジュールに分割していて、異なるモジュール間でいかのように複数のViewControllerが存在します。
ModuleA: ViewController1
ModuleB: ViewController2, ViewController3
ModuleC: ViewController4
このとき、各ViewControllerのインスタンスを保持したまま、navigationControllerで遷移するために、プログラムをモジュール化する前までは、
Swift
1AppDelegate.swift 2 3let app = UIApplication.sharedApplication().delegate! as! AppDelegate 4 5@UIApplicationMain 6class AppDelegate: UIResponder, UIApplicationDelegate { 7 8 var window: UIWindow? 9 var navigationController: UINavigationController! 10 var someViewController = SomeViewController() 11 var otherViewController = OtherViewController() 12 var anotherViewController = AnotherViewController() 13 ... 14} 15
と、インスタンスをすべてAppDelegateに配置する方法をとっていました。しかしモジュール化したことによって、それぞれのモジュールからAppDelegateのインスタンスを確保しようとすればimportで循環参照が発生してしまいます。
こういった場合、全てのViewControllerに対して
Swift
1SomeViewController.swift in module1 2 3public class SomeViewController : UIViewController { 4 public weak var delegate: SomeViewControllerDelegate? 5 6 func aTransitionMethod() { 7 delegate?.pushViewControllerWithIdentifier("SomeViewController") 8 } 9} 10 11public protocol SomeViewControllerDelegate: class { 12 func pushViewControllerWithIdentifier(identifier: String) 13 func popViewController() 14}
といったように遷移用のdelegateを付加し、各モジュールがAppDelegateを含むモジュールを参照しないようにする方法を考えましたが、あまり良い方法に思えません。
あるいは、AppDelegateを使うことが問題なだけであって、すべての親のViewControllerを用意して、他のViewControllerのdelegateを一括で持つのが良いということでしょうか。
またこのやり方であれば、これらのViewControllerを全て参照するクラス(AppDelegateなど)で、identifierの値が実際にどのクラスを示すかswitchで分岐する必要が生じると思いますが、それは問題のない設計でしょうか。
より良い解決策はあるでしょうか。ご教示をお願いします。
追記
そもそもモジュールの分割方法として、ViewControllerがアチラコチラに散らばる設計が間違っているのでしょうか。そうであればモジュールは
Module1 = Modelのみ
Module2 = ViewControllerのみ
Module3 = カスタムViewのみ
などとして分割されるべきでしょうか。自分は元々は以下のように分離しています。
Module1 = Modelのみ
Module2 = ViewController & カスタムView の一部
Module3 = ViewController & カスタムView の一部
....
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/08/24 03:38
2015/08/24 12:05
2015/08/24 13:24