swift2 在ViewController和ContainerViewController之间传递数据

olqngx59  于 2022-11-06  发布在  Swift
关注(0)|答案(3)|浏览(165)

我正在开发一个应用程序,需要在视图和containerView之间传递数据。我需要从这两个视图发送和接收数据。
让我更好地解释一下:
我可以通过协议更改标签主文件(触摸容器按钮),但我无法更改标签容器(触摸主文件按钮)。发生的情况是主文件通过跟随与容器连接。但没有跟随容器链接到主文件。
我试着加上但segue到,但它的工作。

主视图控制器:

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

有人能帮帮我吗?

6kkfgxo0

6kkfgxo01#

您需要做的就是在主视图控制器中保留对Container的引用。
也就是说,你应该在Master中添加一个示例变量,它将包含对视图控制器的引用,而不仅仅是视图。
因此,主视图控制器的开头将类似于:

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

jhkqcmku2#

我用这个代码解决了它
从视图控制器-〉容器视图控制器发送数据

Class ViewController : UIViewController {

func sendData(MyStringToSend : String) {

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

}

在容器视图控制器中

Class ContainerViewController : UIViewController {

@IBOutlet weak var myLabel: UILabel!

func ChangeLabel(labelToChange : String){

myLabel.text = labelToChange

 }
}

从容器视图控制器-〉视图控制器发送数据

Class ContainerViewController : UIViewController {

func sendDataToVc(myString : String) {

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

}

和视图控制器中

Class ViewController : UIViewController {

  func dataFromContainer(containerData : String){

   print(containerData)
  }

  }

我希望这能帮助到一些人。

kmbjn2e3

kmbjn2e33#

您可以使用此扩展访问容器子项

extension UIViewController {
  func getContainerChild<vc:UIViewController>(_ viewController : vc,_ hasNavigation : Bool = true) -> (vc) {
    guard let vc = self.children[0] as? UINavigationController else {return viewController}
    if hasNavigation {
        guard let childVC = vc.children[0] as? PurchasedHistoryListVC else {
            return viewController}
        return childVC as! vc
    } else {
        return vc as! vc
    }
   }
}

因此您可以在视图控制器中执行类似操作

let vc = self.getContainerChild(yourChildViewControllerClass())
vc.functionName()

相关问题