事件处理程序中的实例var始终是初始值

时间:2015-01-12 19:37:50

标签: ios swift ios8 event-handling

我在访问事件处理程序中的实例var时遇到问题。

当我尝试在事件处理程序中访问实例var时,它似乎总是具有初始值,即使该值已经发生了变化。

在我的简单演示应用程序中,我有一个水平滑块和一个UIImageView:

manifest screenshot

ViewController.swift

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var slider: UISlider!

    var canvas:MyCanvas?

    override func viewDidLoad() {
        super.viewDidLoad()
        self.canvas = MyCanvas()
    }

    @IBAction func sliderValueChanged(sender: UISlider) {
        self.canvas!.sliderValueUpdated(sender.value);
    }
}

MyCanvas.swift

import Foundation
import UIKit

class MyCanvas : UIImageView {

    // the var I care about
    var sliderValue:Float = 0.5;

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    override init() {
        super.init()
    }

    func sliderValueUpdated (newValue:Float) {
        self.sliderValue = newValue;

        // prints the correct value
        println(self.sliderValue)
    }

    override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {

        // always prints initial value, 0.5
        println(self.sliderValue)
    }
}

我将MyCanvas.swift设置为UIImageView的自定义类。

因此,当我调整滑块时,会打印出self.sliderValue的正确值。但是,当我在此之后触发触摸事件时,它总是打印出初始值0.5而不是滑块值。

为什么?

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

我认为您的问题是您的画布上没有IBOutlet。通过在viewDidLoad中初始化画布,初始化的画布实际上不在屏幕上(您必须将其添加到子视图中)。因此,您的sliderValueChanged IBAction实际上并未更新屏幕上sliderValue的{​​{1}}属性。我建议将故事板中的MyCanvas设置为UIImageView课程,并MyCanvas IBOutlet MyCanvas Storyboard canvas = MyCanvas()。然后从viewDidLoad功能中删除{{1}}。