swift - 引数 - ビューコントローラとコンテナビューコントローラ間でデータを渡す




swift sharedapplication() (2)

私は、アプリケーションで作業しているとビューとcontainerViewの間でデータを渡す必要があります。 私はデータを送信し、両方のビューからデータを受け取る必要があります。

私はより良く説明しましょう:

私はラベルマスターを変更することができます(コンテナボタンをタッチしますプロトコルでは、私はラベルコンテナを変更することはできません(マスターボタンをタッチ)。 どのようなことが起こるかは、主が次のようにして容器に接続することです。 しかし、マスターにリンクするコンテナに従わないでください。

私は追加しようとしたがセグをしようとしたが、うまくいった。

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

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
    }
}

コンテナビューコントローラ:

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
    }
}

誰か助けてくれますか?

https://code.i-harness.com


マスタービューコントローラにContainerへの参照を保持するだけです。

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

マスタービューコントローラーの始まりは次のようになります:

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
    }
}

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

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)
  }

  }

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