我正在尝试使用委托(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/