2016-02-11 4 views
2

Мне нужно, чтобы в моем диспетчере 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)// 
     } 
    } 
} 
+0

Установлен ли ваш делегат? Ваша техника неортодоксальная. Обычно вы должны установить делегат в prepareForSegue – Paulw11

+0

Но что, если это пользовательский класс или 'UIView', то что принято? помещает это в 'viewDidLoad()' плохую практику здесь? – MikeG

+0

Вы, кажется, запутываете ViewControllers и Views. У вас есть 'if let cont = vc as? CircleView', но CircleView - это UIView, а не UIViewController. Поэтому он всегда будет терпеть неудачу. – Michael

ответ

1

Если у вас есть ваши CircleView «s добавлен в связи с контроллерами зрения:

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 является контроллером вид и CircleView является UIView в результате делегата никогда не будет установлен.


Примечание: этот ответ только показывает, что он делает не так, и это отнюдь не предполагая, как делать вещи.

Смежные вопросы