我正在尝试使用委托和协议,但是遇到了问题。
我在一个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)
语句。
有什么想法吗?
答案 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