web-dev-qa-db-ja.com

ViewControllerとContainerViewControllerの間でデータを渡す

私はアプリに取り組んでおり、viewとcontainerViewの間でデータを渡す必要があります。データを送信し、両方のビューからデータを受信する必要があります。

もっと詳しく説明させてください。

Label Master(Container Buttonにタッチ)をprotocolで変更できます、しかし、Label Container(Masterボタンをタッチ)を変更することはできません。起こることは、マスターが次の方法でコンテナに接続することです。ただし、マスターにリンクするフォローコンテナはありません。

追加しようとしましたが、セグエになりましたが、うまくいきました。

enter image description here

マスタービューコントローラー:

import UIKit

protocol MasterToContainer {
    func changeLabel(text:String)
}

class Master: UIViewController, ContainerToMaster {

    @IBOutlet var containerView: UIView!

    var masterToContainer:MasterToContainer?

    @IBOutlet var labelMaster: UILabel!


    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "containerViewSegue" {
            let view = segue.destinationViewController as? Container
            view!.containerToMaster = self
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func button_Container(sender: AnyObject) {
        masterToContainer?.changeLabel("Nice! It's work!")
    }


    func changeLabel(text: String) {
        labelMaster.text = text
    }
}

Container View Controller:

import UIKit

protocol ContainerToMaster {
    func changeLabel(text:String)
}

class Container: UIViewController, MasterToContainer {

    var containerToMaster:ContainerToMaster?

    @IBOutlet var labelContainer: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    @IBAction func button_Master(sender: AnyObject) {
        containerToMaster?.changeLabel("Amazing! It's work!")
    }


    func changeLabel(text: String) {
        labelContainer.text = text
    }
}

誰か助けてくれますか?

16
James

必要なのは、マスターView ControllerでContainerへの参照を保持することだけです。

つまり、ビューだけでなくview controllerへの参照を保持するMasterにインスタンス変数を追加する必要があります。 prepareForSegueで設定する必要があります。

したがって、Master View Controllerの始まりは次のようになります。

class Master: UIViewController, ContainerToMaster {

@IBOutlet var containerView: UIView!

var containerViewController: Container?

@IBOutlet var labelMaster: UILabel!

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "containerViewSegue" {
        containerViewController = segue.destinationViewController as? Container
        containerViewController!.containerToMaster = self
    }
}

そして、ボタン関数で、追加した変数を使用してラベルを変更するだけです。

例:

@IBAction func button_Container(sender: AnyObject) {
    containerViewController?.changeLabel("Nice! It's work!")
}

これは、MasterToContainerプロトコルも削除できることを意味します。

このコードをテストしたので、動作することはわかっていますが、残念ながら、私はObjective-C開発者であり、Swiftのベストプラクティスについては何も知りません。したがって、これが最善の方法であるかどうかはわかりませんが、確かに機能します。

編集:

テストしたコードは次のとおりです。

Master.Swift:

import UIKit

class Master: UIViewController, ContainerToMaster {

    @IBOutlet var containerView: UIView!
    @IBOutlet var labelMaster: UILabel!
    var containerViewController: Container?

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "containerViewSegue" {
            containerViewController = segue.destinationViewController as? Container
            containerViewController!.containerToMaster = self
        }
    }

    @IBAction func button_Container(sender: AnyObject) {
        containerViewController?.changeLabel("Nice! It's work!")
    }

    func changeLabel(text: String) {
        labelMaster.text = text
    }
}

Container.Swift:

import UIKit

protocol ContainerToMaster {
    func changeLabel(text:String)
}

class Container: UIViewController {

    @IBOutlet var labelContainer: UILabel!
    var containerToMaster:ContainerToMaster?

    @IBAction func button_Master(sender: AnyObject) {
        containerToMaster?.changeLabel("Amazing! It's work!")
    }

    func changeLabel(text: String) {
        labelContainer.text = text
    }
}
26
T Blank

このコードで解決しました

ViewController-> ContainerViewControllerからデータを送信するには

Class ViewController : UIViewController {

func sendData(MyStringToSend : String) {

let CVC = childViewControllers.last as! ContainerViewController
CVC.ChangeLabel( MyStringToSend)
}

}

containerViewControllerで

Class ContainerViewController : UIViewController {

@IBOutlet weak var myLabel: UILabel!

func ChangeLabel(labelToChange : String){

myLabel.text = labelToChange

 }
}

ContainerViewController-> ViewControllerからデータを送信するには

Class ContainerViewController : UIViewController {

func sendDataToVc(myString : String) {

   let Vc = parentViewController as! ViewController
   Vc.dataFromContainer(myString)
 }

}

とViewControllerで

  Class ViewController : UIViewController {

  func dataFromContainer(containerData : String){

   print(containerData)
  }

  }

これが誰かの助けになることを願っています。

25
Rob