2017-08-11 12 views
0

私はiOSアプリケーション用に以下のレイアウトを持っています。1つのView Controllerを別のコントローラから制御するにはどうすればよいですか?

Storyboard Layout!

私は何をするつもりだがグリーンのViewControllerを制御するためにpurpleVCにテーブルビューを入れている...トップpeachVCは変更する必要がありますその中にテキストを持つことになります。私はちょうど別のビューコントローラからどのように1つのビューコントローラを制御するか分からない。これには、GreenVCのボタンがクリックされたときに紫色のスライドを出し入れすることが含まれます。私はこれを行うクラスがあることを知っているが、私は同様に学びたい。

TESTINGデリゲート:

MAINVIEWののcontroler

import UIKit 

protocol Purpleprotocol { 
    func buttonpressed() 
} 

protocol Greenprotocol { 

} 

extension UIViewController { 

    func alert(message: String, title: String = "") { 
     let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert) 
     let OKAction = UIAlertAction(title: "OK", style: .default, handler: nil) 
     alertController.addAction(OKAction) 
     self.present(alertController, animated: true, completion: nil) 
    } 
} 

class MainViewController: UIViewController,Purpleprotocol,Greenprotocol { 
    weak var infoNav : UINavigationController? 
    weak var greenVC: GreenVC? 
    weak var purpleVC: PurpleVC? 
    weak var peachVC: PeachVC? 

    func buttonpressed() { 
     alert(message: "This is message") 
     print("buttonpressed") 
     let date = Date() 
     let calendar = Calendar.current 
     let hour = calendar.component(.hour, from: date) 
     let minutes = calendar.component(.minute, from: date) 
     greenVC?.greenlabel.text = String(hour) + ":" + String(minutes) 
    } 

     override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if segue.identifier == "contentSegue" { 
      let infoNav = segue.destination as! UINavigationController 

     } 
    } 
} 

PURPLEVIEWののcontroler

class PurpleVC: UIViewController { 

    var delegate: Purpleprotocol? 

    @IBAction func butclick(_ sender: UIButton) { 
     alert(message: "infunction") 
     delegate?.buttonpressed() 
      } 


    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

おかげ R

+0

ナビゲーションコントローラ経由で動作するかどうかは十分にはわかりませんが、似たような操作を行っていますが、一方のView Controllerからもう一方のView Controllerに直接接続しています。基本的には、デリゲートを作成し、2番目のVCのデリゲートに準拠させることでした。最初のVCは、2番目のViewコントローラのメソッドを起動し(希望の方法でコントロールします)、次にsegueを実行したいときに、変更された2番目のVCをロードして表示します。 似たようなものがあなたに役立つかもしれません。 –

答えて

0

それはケースに依存しないが、いくつかの例を参照してください:

A)をあなたは代表者を通してそれを接続することができます。メインビューコントローラには、変更を報告する3つの子ビューコントローラがあります。また、3つの子コントローラすべてにデリゲートとして割り当てて、イベントのすべての通知を取得する必要があります。これは、あなたが画面全体を制御し、それぞれの子のためのデリゲートを持っているデータモデルを有することができる

func purpleViewController(sender: PVC, selectedItem: Item) { 
    self.greenViewController.showItem(item: selectedItem) 
    self.peachVC.showItem(item: selectedItem) 
} 

func purpleViewController(sender: PVC, shouldSetMenuClosed closed: Bool) { 
    self.menuConstraint.constant = closed ? targetWidth : 0.0 
} 

B)のようになります。モデルは代理人の変更を報告し、それに応じて対応することができます。メインビューコントローラは、ロード時にこのモデルのインスタンスを作成し、それをすべての子ビューコントローラに渡します。緑色コントローラで

:子供たちは、直接モデルを操作することになるモデルで

func onTap() { 
    mode.menuShown = !mode.menuShown 
} 

var menuShown: Bool = true { 
    didSet { 
     self.menuDelegate.model(self, changedMenuShownStateTo: menuShown) 
    } 
} 

メインビューコントローラで:

func model(_ sender: Model, changedMenuShownStateTo shown:Bool) { 
    self.menuConstraint.constant = shown ? 0.0 : targetWidth 
} 

C)どのコントローラでも通知が使用できる通知センタに通知して、カスタム通知および他のコントローラが通知を観察し、それに応じて行動してもよい。

他の方法もありますが、おそらく最も人気があります。それらのいずれかがあなたに合っているかどうかを確認してください...

0

代表団。

あなたのMainViewControllerは、情報を渡したい埋め込みVCのそれぞれの代理人になります。あなたの説明から、2つのデリゲート関係が必要です:

protocol PurpleProtocol { 
    func selected(row: Int, text: String) 
} 

protocol GreenProtocol { 
    func slideButtonPressed() 
} 

MainViewControllerにこれらのプロトコルを実装させてください。 埋め込みコードに識別子を付けます。それらは文書概要ビューで見つけることができます。

class GreenViewController: UIViewController { 
    weak var delegate: GreenProtocol? 

    @IBAction slideButtonPressed(sender: UIButton) { 
     delegate?.slideButtonPressed() 
    } 
} 

class PurpleViewController: UITableViewController { 
    weak var delegate: PurpleProtocol? 

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     delegate?.selected(row: indexPath.row, text: modelArray[indexPath.row]) 
    } 
} 
:それは時間のあるときに埋め込まれたVCので

class MainViewController: UIViewController, PurpleProtocol, GreenProtocol { 
    weak var greenVC: GreenViewController? 
    weak var purpleVC: PurpleViewController? 
    weak var peachVC: PeachViewController? 

    func selectedRow(row: Int, text: String) { 
     // do something useful 
    } 

    func slideButtonPressed() { 
     // slide purple view in or out depending on current state 
    } 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if segue.identifier == "EmbedPurple" { 
      let dvc = segue.destination as! PurpleViewController 
      purpleVC = dvc 
      dvc.delegate = self 
     } 
     else if segue.identifier = "EmbedGreen" { 
      let nav = segue.destination as! UINavigationController 
      let dvc = nav.topViewController as! GreenViewController 
      greenVC = dvc 
      dvc.delegate = self 
     } else if segue.identifier = "EmbedPeach" { 
      peachVC = segue.destination as! PeachViewController 
     } 
    } 
} 

delegateポインタを追加し、プロトコルメソッドでデリゲートを呼び出します。prepareForSegueでは、埋め込まれたVCのへのポインタを保持し、代理人としてあなたの自己を渡します

+0

OK私は脳がまだそこにはまだありませんので、私は紫からボタンをクリックすると、緑の中のVCを変更します。 .. – BostonMacOSX

+0

紫色の行をクリックすると、 'MainViewController'の' selectedRow'が呼び出されます。 'selectedRow'は、' greenVC'プロパティを使ってメソッドを呼び出し、 'GreenViewController'のプロパティを設定することができます。 'greenVC?.SomeProperty = value'や' greenVC?.SSummingUseful() 'のようなものです。 – vacawama

+0

ああ、ありがとう...最後のもの。私が他のViewControllerのために緑を交換したいのであれば.....(それが私がそこにnavを置いている理由です)私は紫色のものを "メニュー"にしようとしていて、緑色のものは... – BostonMacOSX

関連する問題