您需要注册通知并进行调用。让我解释一下如何在第一个viewcontroller的按钮上单击时首先添加以下代码:
我是Swift的新手,目前与代表激动。我需要从父控制器中的按钮更改嵌入式控制器UIColor。
这是我尝试过的
1)我用func和UIColor创建了一个委托协议2)在父VC(ThirdViewController)中添加一个实例
父VC中的代码
import UIKit
protocol TVCDelegate: class {
func setColor(color: UIColor)
}
class ThirdViewController: UIViewController {
weak var delegate: TVCDelegate?
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let vc = segue.destination as? AdditionalThirdViewController {
vc.setColor(color: UIColor.red) }}
@IBAction func redButton(_ sender: Any?) {
I need this button to change color in **Embedded VC** }
override func viewDidLoad() {
super.viewDidLoad() }
}
}
extension ThirdViewController: TVCDelegate {
func setColor(color: UIColor) {
view.backgroundColor = color
} }
嵌入式vc中的代码
import UIKit
class AdditionalThirdViewController: UIViewController {
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let vc = segue.destination as? ThirdViewController {
vc.delegate = self } }
@IBAction func redButton(_ sender: Any) {
}
override func viewDidLoad() {
super.viewDidLoad()
最后,我需要两个控制器都具有三个按钮,并且每个按钮都需要改变其他控制器中的颜色。
我该如何实现?另外,您是否也有建议阅读有关假人代表的内容?
我强烈建议您详细阅读本文,并了解委托的工作方式和周围的数据
https://medium.com/@jamesrochabrun/implementing-delegates-in-swift-step-by-step-d3211cbac3ef
在这种情况下,当您在ThirdViewController中点击按钮时,您必须调用委托方法。
@IBAction func redButton(_ sender: Any?) {
delegate?.setColor(UIColor.red)
}
上面的代码将调用值为红色的委托方法。现在,您需要在EmbededViewController中捕获此值,并需要像这样实现TVCDelegate
extension AdditionalThirdViewController: TVCDelegate {
func setColor(color: UIColor) {
//Set Color sent by ThirdViewController
}
}
同样,您需要了解代表的基础知识。
另外删除您在ThirdViewController中编写的代码
extension ThirdViewController: TVCDelegate {
func setColor(color: UIColor) {
view.backgroundColor = color
} }
声明委托的类不能实现相同的委托。
尝试提供更多说明...
协议/委托设计模式允许我们将工作“委托”到另一个类/对象。
[一个非常常用的情况-人们甚至没有意识到他们正在使用它-是带有表格视图的。表格视图本身会检测用户何时点击某行,然后告诉其delegate刚刚发生过。那时,表视图不知道基于行选择应该采取什么操作……它只是告诉它的委托(表视图控制器):
“嘿!用户在我的行中选择了!”
和控制器符合]通过执行以下操作来符合该协议:
正在发送该消息(func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { // do something because a row was selected }
在此实现中,我们知道who>]
tableView
),并且知道选择了哪一行(indexPath
)。表格视图本身不需要了解任何有关行内容或下一步将发生的事情……它delegates该任务交给控制器。[在您的情况下,您想将视图控制器加载到容器视图中,并让该控制器中的按钮告诉其委托(父控制器)“点击了一个按钮”,然后让父控制器决定要执行的操作-例如更改其背景颜色。
对于parent
视图控制器中的按钮,您只需设置容器VC视图的.backgroundColor
属性,或者(可选)在该控制器中调用一个函数。几年前,我整理了一个简单,非常相似的示例,并对其进行了更新,以更好地反映您的尝试。您可以在这里找到它:https://github.com/DonMag/ContainerDelegate
看起来像这样:
轻按青色或橙色按钮(在主控制器中)将在容器视图中更改VC的背景。
在容器视图中点击红色或绿色按钮将告诉其委托
:“嘿!轻按了彩色按钮!”
和委托函数(在主控制器中)将更改大Label的背景颜色。
您需要注册通知并进行调用。让我解释一下如何在第一个viewcontroller的按钮上单击时首先添加以下代码:
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "changeColor"), object: nil, userInfo: nil)
在添加该代码后,转到第三个视图控制器,然后在viewwillappear中添加此代码:
NotificationCenter.default.addObserver(self, selector: #selector(YOURVIEWCONTROLLERNAME.changeColor(notification:)), name: Notification.Name(rawValue: "changeColor"), object: nil)
之后在thirdviewcontroller中添加此方法
@objc func changeColor(notification: NSNotification)
{
self.view.backgroundColor = .red
}
您现在都准备好了。
您需要注册通知并进行调用。让我解释一下如何在第一个viewcontroller的按钮上单击时首先添加以下代码: