ios - 事件处理程序中的实例变量始终为初始值

标签 ios swift ios8 event-handling

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

当我尝试访问事件处理程序中的实例 var 时,它似乎始终具有初始值,即使此后该值已更改。

在我的简单演示应用程序中,我有一个水平 slider 和一个 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 的自定义类。

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

这是为什么?

我该如何解决这个问题?

最佳答案

我认为你的问题是你的 Canvas 没有IBOutlet。通过在 viewDidLoad 中初始化 Canvas ,初始化的 Canvas 实际上并不在屏幕上(您必须将它添加到 subview 中)。因此,您的 sliderValueChanged IBAction 实际上并未更新屏幕上 MyCanvassliderValue 属性。我建议将 Storyboard中的 UIImageView 设置为 MyCanvas 类,并为你的 MyCanvas 对象创建一个 IBOutlet Storyboard。然后从 viewDidLoad 函数中删除 canvas = MyCanvas()

关于ios - 事件处理程序中的实例变量始终为初始值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27909455/

相关文章:

ios - 快速代码崩溃,记录 : dyld: Library not loaded: @rpath/libswiftCore. dylib

ios - 将 Realm 对象保存到数据库

ios - 在 Swift 中继承自 UINavigationController

ios - AVPlayerLayer 大小不正确

ios - 更改 UIView 框架结束触摸事件

popover - iOS 8 - UIPopoverPresentationController 移动弹出框

ios - 如果有任何应用程序在后台运行,请调整大小

ios - 构造具有元类型值的类类型 'ClassName' 的对象必须使用 'required' 初始化程序 XCode8 Swift 3 更改

ios - Swift UIView 内存使用和处理许多 subview

ios - 创建多页 PDF