Мне нужно, чтобы в моем диспетчере ViewController обновлялись вручную из моего другого класса. Переменные обновляются в моем втором классе, но степперы не сбрасываются, как они предполагают. Я думаю, что неправильно позвоню своему делегату.Swift делегат и протокол не работают
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)//
}
}
}
Установлен ли ваш делегат? Ваша техника неортодоксальная. Обычно вы должны установить делегат в prepareForSegue – Paulw11
Но что, если это пользовательский класс или 'UIView', то что принято? помещает это в 'viewDidLoad()' плохую практику здесь? – MikeG
Вы, кажется, запутываете ViewControllers и Views. У вас есть 'if let cont = vc as? CircleView', но CircleView - это UIView, а не UIViewController. Поэтому он всегда будет терпеть неудачу. – Michael