18

私はアプリに取り組んでおり、ビューと 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
    }
}

誰かが私を助けることができますか?

4

3 に答える 3

31

あなたがする必要があるのはContainer、マスター ビュー コントローラーで参照を保持することだけです。

つまり、ビューだけでなくビュー コントローラー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 のベスト プラクティスについては何も知りません。したがって、これが最善の方法であるかどうかはわかりませんが、確かに機能します。

編集:

私がテストした正確なコードは次のとおりです。

マスター.スウィフト:

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
    }
}
于 2015-12-18T06:05:19.593 に答える