私はアプリに取り組んでおり、viewとcontainerViewの間でデータを渡す必要があります。データを送信し、両方のビューからデータを受信する必要があります。
もっと詳しく説明させてください。
Label Master(Container Buttonにタッチ)をprotocolで変更できます、しかし、Label Container(Masterボタンをタッチ)を変更することはできません。起こることは、マスターが次の方法でコンテナに接続することです。ただし、マスターにリンクするフォローコンテナはありません。
追加しようとしましたが、セグエになりましたが、うまくいきました。
マスタービューコントローラー:
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
}
}
誰か助けてくれますか?
必要なのは、マスター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
}
}
このコードで解決しました
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)
}
}
これが誰かの助けになることを願っています。