2016-05-10 12 views
2

メインのViewControllerはUINavigationControllerサブクラスに組み込まれており、VCにはnibからロードされたサブビューがあります。サブビューはMenuViewと呼ばれ、他のVCにリンクするUIButtonを含みます。rootVC Subview(Nibからロードされたサブビュー)からUINavigationControllerにアクセス

メインViewControllerの操作性を損なうことなく、これらのボタンをすべて、メニューの開閉をアニメーションするペン先からロードするサブビューに入れました。

しかし、私はこれらから他のビューコントローラを紹介したいと思います。時には "Modally"、時には "Show"もあります。私がやったことはうまくいくと思われますが、これが問題ないかどうか、あるいは私が気付いていない(メモリーリークなどの原因となる強力な参照サイクルのような)望ましくない影響を引き起こしたかどうかを知りたいだけです。それとももっと良い方法がありますか?

いくつかのコード:MenuView.swiftで

ViewController.swiftで
class MenuView: UIView { 
    var navigationController = CustomNavigationController() 

    func combinedInit(){ 
     NSBundle.mainBundle().loadNibNamed("MenuViewXib", owner: self, options: nil) 
     addSubview(mainView) 
     mainView.frame = self.bounds 
    } 

    @IBAction func optionsAction(sender: AnyObject) { 
     self.navigationController.performSegueWithIdentifier("presentOptions", sender: self) 
    } 

 menuView.navigationController = self.navigationController as! CustomNavigationController 

答えて

1

短い答え:いいえ、いくつかのビューの内からビューコントローラにアクセスするには申し分ないですこれは、すべてのMVCルールが破られるためです。


UIViewオブジェクトが画面にUIコンポーネントを表示するためのものと正確にその子ビューを描画し、レイアウトを担当しています。それがすべてです。それ以上のものはありません。

ビューとコントローラの間のこれらの種類のやりとりは、問題のビューが実際に属しているコントローラで常に処理する必要があります。ビューからビューコントローラにメッセージを送信する必要がある場合は、delegate approachまたはNSNotificationCenterクラスのいずれかを使用できます。

私が靴の中にいた場合、ビューがそのビューコントローラから何らかの情報を必要とする場合、私はデリゲートを使用します。通知センターを使用するよりも理解しやすくなります。なぜなら、通知センターは、その間に何が起こっているのかを把握しやすくするからです。ビューコントローラがビュー(換言すると、別の言い方をすると)から何らかの情報を必要とする場合、私は通知センターに行くでしょう。

protocol MenuViewDelegate: class { 
    func menuViewDidClick(menuView: MenuView) 
} 

class MenuView: UIView { 
    var weak delegate: MenuViewDelegate? 

    @IBAction func optionsAction(sender: AnyObject) { 
    delegate?.menuViewDidClick(self) 
    } 
} 

のは、ビューコントローラ側で何が起こっているのかを見てみましょう:iOS版での通信パターンの詳細については

class MenuViewController: UIViewController, MenuViewDelegate { 

    override func viewDidLoad() { 
    ... 
    self.menuView.delegate = self 
    } 

    func menuViewDidClick(menuView: MenuView) { 
    navigationController?.performSegueWithIdentifier("presentOptions", sender: self) 
    } 
} 

、あなたがこの偉大なarticleで見てみましょうすることをお勧めします彼らがどのように働くか理解するために。

+0

お返事ありがとうございます。デリゲートを使用することを考えていたのは、かなり理解しやすいからです。デリゲートの場合は、presentViewController(segueKey:String)のような関数を使ってプロトコルを作成し、その関数をメインのviewcontrollerに置き、menuView.delegateをselfに割り当てます。正しい? –

+0

はい、そうですね。私は自分の答えを更新したので、デリゲートの使い方を知ることができます。 – ozgur

+0

素晴らしいです、ありがとうございます。簡単な質問:なぜ、menuViewDidClickメソッドのViewControllerの引数として送信者を渡す必要がありますか? –

関連する問題