ios - 关于 swift 中的委托(delegate)和协议(protocol)的问题(举例)

标签 ios swift

我正在尝试使用委托(delegate)和协议(protocol),但遇到了问题。

我在一个 ViewController 上创建了 2 个按钮,并在另一个 ShowViewController 中创建了 1 个 imageView。 imageView 的颜色会根据按下的按钮而改变。

ViewController.swift

import UIKit

protocol getColorProtocol {
    func getColor(color:String?)
}


class ViewController: UIViewController {

    var color: String?

    var delegate:getColorProtocol?

    @IBAction func blueButtonPressed(_ sender: Any) {

        color = "blue"
        delegate?.getColor(color: color)
    }

    @IBAction func redButtonPressed(_ sender: Any) {

        color = "red"
        delegate?.getColor(color: color)

    }


    override func viewDidLoad() {
        super.viewDidLoad()

    }



}

ShowViewController.swift

import UIKit


class ShowViewController: UIViewController, getColorProtocol {

    var viewOne = ViewController()

    @IBOutlet weak var colorView: UIImageView!

    func getColor(color: String?) {
        print("color is \(color!)")

        if color == "red"{
            colorView.backgroundColor = UIColor(displayP3Red: 255/255, green: 0/255, blue: 0/255, alpha: 1)
        }
        else if color == "blue" {
            colorView.backgroundColor = UIColor(displayP3Red: 0/255, green: 0/255, blue: 255/255, alpha: 1)

        }


    }

    override func viewDidLoad() {
        super.viewDidLoad()

        viewOne.delegate = self

    }

}

press here to view the storyboard !

您可以查看上面的 Storyboard。

目前没有错误,但无法调用getColor函数。我想知道问题是否来自 delegate?.getColor(color: color) 语句。

有什么想法吗?

最佳答案

首先,就您的情况而言,您不需要使用委托(delegate)模式

您的ViewController通过segue直接连接到ShowViewController 您可以使用 prepareForSegue 代替

其次,我认为您不了解委托(delegate)模式的工作原理, 在 ShowViewController 内部,您创建了一个名为 viewOne 的新 ViewController,它不是原始的 ViewController,所以这就是您的代码不起作用的原因正如预期的那样

正如我上面提到的,你应该使用 segue

首先,转到storyboard设置您的segue标识符。然后,在您的 ViewController

override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
if (segue.identifier == "goToShowVC") {
    //your code here
}
}

关于ios - 关于 swift 中的委托(delegate)和协议(protocol)的问题(举例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53663158/

相关文章:

ios - Firestore 文档存在在 iOS Swift 中返回错误结果

iphone - CLLocationManager - iPhone 应用程序中的自定义位置管理器

ios - 未创建简单导航 Controller

objective-c - iOS 5 和 UIViewController presentViewController - 现在是否可以在不破解的情况下更改模态 Controller 的大小?

ios - 如何在 IOS 9 中检查联系人社交帐户

ios - 在 swift 中使用 AFHTTPSessionManager

ios - Xcode 10 iOS firebase firestore SDK——多个命令在 Firebase 中产生 gRPCCertificates.bundle 错误

ios - 设置允许不同大小的应用程序范围的默认字体

swift - swift 5.0 中私有(private)类属性的默认访问修饰符是什么?

ios - 在 UIViewRepresentable 中获取 UIView 的框架或边界