我在访问事件处理程序中的实例变量时遇到问题。
当我尝试访问事件处理程序中的实例 var 时,它似乎始终具有初始值,即使此后该值已更改。
在我的简单演示应用程序中,我有一个水平 slider 和一个 UIImageView:
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 的自定义类。
因此,当我调整 slider 时,它会打印出 self.sliderValue
的正确值。但是,当我在那之后触发触摸事件时,它总是打印出初始值 0.5
而不是 slider 值。
这是为什么?
我该如何解决这个问题?
最佳答案
我认为你的问题是你的 Canvas 没有IBOutlet
。通过在 viewDidLoad
中初始化 Canvas ,初始化的 Canvas 实际上并不在屏幕上(您必须将它添加到 subview 中)。因此,您的 sliderValueChanged IBAction
实际上并未更新屏幕上 MyCanvas
的 sliderValue
属性。我建议将 Storyboard中的 UIImageView
设置为 MyCanvas
类,并为你的 MyCanvas
对象创建一个 IBOutlet
Storyboard
。然后从 viewDidLoad
函数中删除 canvas = MyCanvas()
。
关于ios - 事件处理程序中的实例变量始终为初始值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27909455/