gpt4 book ai didi

swift - 在 ViewController 和 ContainerViewController 之间传递数据

转载 作者:IT王子 更新时间:2023-10-29 05:16:24 24 4
gpt4 key购买 nike

我正在开发一个应用程序,需要在 View 和 containerView 之间传递数据。我需要从两个 View 发送和接收数据。

让我更好地解释一下:

我可以通过协议(protocol)更改Label Master(触摸容器按钮),但我不能更改标签容器(触摸主按钮)。发生的事情是 Master 通过以下方式与容器连接。但是没有一个follow Container链接到Master。

我尝试添加 but segue 到,但它成功了。

enter image description here

主视图 Controller :

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

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

有人可以帮助我吗?

最佳答案

您需要做的就是在主视图 Controller 中保留对Container 的引用。

也就是说,您应该向 Master 添加一个实例变量,它将保存对 View Controller 的引用,而不仅仅是 View 。您需要在 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 协议(protocol)。

我测试了这段代码,所以我知道它可以工作,但不幸的是我是一名 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
}
}

容器.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
}
}

关于swift - 在 ViewController 和 ContainerViewController 之间传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34348275/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com