Swift委托和协议不起作用

时间:2016-02-11 04:30:12

标签: ios swift delegates protocols

我需要ViewController中的步进器从我的其他类手动更新。变量在我的第二课中更新,但步进器不会像他们想象的那样重置。我想我错误地打电话给我的代表。

ViewController:

class ViewController: UIViewController, CircleViewDelegate {

    var colors = CircleView()
    @IBOutlet weak var circleView1: CircleView! 
    @IBOutlet weak var redStepper: UIStepper!
    @IBOutlet weak var redValue: UILabel!
    @IBAction func stepperChange(sender: UIStepper) {
        circleView1.redd1 = Int(redStepper.value);
        redValue.text = Int(sender.value).description;
    }
    func updateRedStepperValue(value: Double) {

        redStepper.value = value
        redValue.text = Int(colors.redd1.value).description;
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        let app = UIApplication.sharedApplication().delegate! as! AppDelegate
        if let viewControllers = app.window?.rootViewController?.childViewControllers {
            viewControllers.forEach { vc in
                if let cont = vc as? CircleView {
                    cont.delegate = self
                }
            }
        }
    }
}

第二课程:

protocol CircleViewDelegate {
    func updateRedStepperValue(value: Double)
    func updateGreenStepperValue(value: Double)
    func updateBlueStepperValue(value: Double)
}

class CircleView: UIView {
    var delegate: CircleViewDelegate?
    var redd1 = 0

    func updateValues() {
        if(redd1 == Int(red1)) {
            redd1 = 0;
            delegate?.updateRedStepperValue(0.0)//
        }
    }
}

1 个答案:

答案 0 :(得分:1)

假设您已将CircleView添加到视图控制器的视图中:

viewControllers.forEach { $0.view.subviews.forEach { ($0 as? CircleView)?.delegate = self } }

为了好玩。我不确定您正在做什么,但您似乎想要设置所有现有CircleView的委托。有许多更好方法,而不是遍历所有视图控制器的视图。

<强>错误:

viewControllers.forEach { vc in
    if let cont = vc as? CircleView {
        cont.delegate = self
    }
}

正如迈克尔在评论中指出的那样,vc是一个视图控制器,而CircleViewUIView,导致您的委托永远不会被设置。

注意:此答案显示他做错了什么,并不表示如何做事。