如何从父控制器更改嵌入式控制器中的UIColor?

问题描述 投票:0回答:3

我是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()

最后,我需要两个控制器都具有三个按钮,并且每个按钮都需要改变其他控制器中的颜色。

我该如何实现?另外,您是否也有建议阅读有关假人代表的内容?

ios swift uiviewcontroller uicollectionview uicolor
3个回答
0
投票

我强烈建议您详细阅读本文,并了解委托的工作方式和周围的数据

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

声明委托的类不能实现相同的委托。


0
投票

尝试提供更多说明...

协议/委托设计模式允许我们将工作“委托”到另一个类/对象。

[一个非常常用的情况-人们甚至没有意识到他们正在使用它-是带有表格视图的。表格视图本身会检测用户何时点击某行,然后告诉其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

看起来像这样:

enter image description here

轻按青色或橙色按钮(在主控制器中)将在容器视图中更改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
    }

您现在都准备好了。


-1
投票

您需要注册通知并进行调用。让我解释一下如何在第一个viewcontroller的按钮上单击时首先添加以下代码:

© www.soinside.com 2019 - 2024. All rights reserved.