快速解决委托和协议的问题(带有示例)

时间:2018-12-07 04:16:10

标签: ios swift

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

我在一个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

您可以在上方查看我的情节提要。

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

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

首先,在您的情况下,您无需使用委托模式

您的ViewController通过ShowViewController直接连接到segue 您可以改用prepareForSegue

第二,我不认为您了解delegate pattern的工作原理, 在ShowViewController内部,您要创建一个名为ViewController的新viewOne,它不是原始的ViewController,因此这就是您的代码无法按预期工作的原因

如上所述,您应该使用segue

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

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

答案 1 :(得分:0)

您不需要为此而委派,而只是准备进行安全检查。我看到您已经设置了两个segue,因此在您的viewcontroller中,假设故事板中的segue被称为“蓝色”和“红色”,您可以添加:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let destinationVC = segue.destination as? ShowViewController {
        if segue.identifier == "blue" {
            destinationVC.color = UIColor.blue
        } else if segue.identifier == “red” {
            destinationVC.color = UIColor.red
        }
    }
}

然后,您需要添加一个颜色变量以在showviewcontroller中进行操作。例如:

var color = UIColor.white
colorview.backgroundcolor = color