2015-01-12 39 views
0

我在訪問事件處理程序中的實例var時遇到問題。事件處理程序中的實例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爲自定義c對於UIImageView而言。

所以,當我調整滑塊,它打印出self.sliderValue正確的值。但是,在此後觸發觸摸事件時,它始終會打印出初始值0.5而不是滑塊值。

這是爲什麼?

我該如何解決這個問題?

+1

我相信你有兩個不同的MyCanvas實例。你有沒有試圖將它設置爲你的UIImageView的自定義類? – cmatsuoka

+0

我相信調試總能解決你的問題。 –

+0

@cmatsuoka你是對的。 'MyCanvas''被實例化兩次。 (一次在代碼中,通過將其設置爲UIImage視圖的自定義類,這就是爲什麼該值永遠不會更新,我通過刪除self.canvas = MyCanvas()來修復它。 – snorpey

回答

1

我認爲你的問題是你的畫布沒有IBOutlet。通過初始化畫布viewDidLoad,初始化的畫布實際上並不在屏幕上(您必須將其添加到子視圖中)。因此,您的sliderValueChanged IBAction實際上並未更新屏幕上MyCanvassliderValue屬性。我建議在故事板中將UIImageView設置爲MyCanvas課程,並在您的Storyboard中將對象設置爲IBOutlet。然後從您的viewDidLoad函數中刪除canvas = MyCanvas()