无法识别的选择器发送到swift构建UISlider的实例

时间:2015-06-03 20:59:52

标签: ios swift uislider

好吧我正在尝试在swift中构建一个简单的UISlider,当我运行我的代码时,我总是得到同样的错误,这是一个sigbrt错误,它给了我这个错误:

2015-06-03 22:36:52.659 myslider [2780:224039] *由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [myslider.ViewController sliderValueChanged:]:发送到实例的无法识别的选择器0x7f92f1e25340' * 首先抛出调用堆栈:

这是代码:

import UIKit

class ViewController: UIViewController {


    @IBOutlet weak var ValueLabel: UILabel!

    var slider: UISlider!



    override func viewDidLoad() {
        super.viewDidLoad()


  slider = UISlider(frame: CGRectMake(100, 100,  200,  23))
        slider.minimumValue = 0
        slider.maximumValue = 100
        view.addSubview(slider)

        slider.center = view.center

        slider.value = slider.maximumValue / 3.0

        slider.addTarget(self, action: "sliderValueChanged:", forControlEvents: UIControlEvents.ValueChanged)
        slider.continuous = false
        salueDidChange(slider)
        ChangeColor()
        thumbImage()

    }
    func salueDidChange(sender: UISlider){
        ValueLabel.text = "\(sender.value)"
    }
    func ChangeColor(){
        slider.maximumTrackTintColor = UIColor.redColor()
        slider.minimumTrackTintColor = UIColor.greenColor()


    }
    func thumbImage(){
        slider.setThumbImage(UIImage(named: "thumbNormal"), forState: UIControlState.Normal)

        slider.setThumbImage(UIImage(named: "thumbHighlighted"), forState: UIControlState.Highlighted)

    }

}

3 个答案:

答案 0 :(得分:2)

使用slider.addTarget(self, action: "sliderValueChanged:", forControlEvents: UIControlEvents.ValueChanged),您告诉Swift在ViewController上调用方法sliderValueChanged:,但ViewController中没有这样的方法。这就是错误告诉你的内容。您最有可能为同一目的撰写salueDidChange,因此您应将salueDidChange重命名为sliderValueChanged并添加@IBAction

如果这不起作用,请尝试从故事板中连接事件处理程序:

  • 删除slider.addTarget代码行。
  • 右键单击故事板中的滑块。看看是否有一个事件处理程序连接到值更改事件。如果是这样,请使用小x删除它。
  • 按住Ctrl键并从滑块拖动到sliderValueChanged方法以再次连接它。

答案 1 :(得分:2)

错误告诉你到底出了什么问题。您正在代码中创建UISlider。你设置了这样的目标:

slider.addTarget(
  self, 
  action: "sliderValueChanged:", 
  forControlEvents: UIControlEvents.ValueChanged)

因此,当您更改滑块的值时,该方法将尝试调用方法" sliderValueChanged:"在你的视图控制器中。该方法需要采用1个参数,即发件人:

@IBAction func sliderValueChanged(sender: AnyObject)
{
  //Do something with the new slider value.
}

发件人的类型也可以是UISlider类型。

如果您在视图控制器中没有使用该签名的方法,则在更改滑块值时会崩溃,就像您说的那样。

编辑:

正如其他人在他们的评论/答案中所指出的,看起来您的目标方法是错误名称的方法salueDidChange。你应该重命名它。

将@IBAction标记放在将从控件调用的方法上也是一个好主意。如果您要在Interface Builder中定义控件并将其连接起来,那么必须这样做(这是一个好主意,而不是在代码中执行。)

答案 2 :(得分:2)

Jonathan,我对无法识别的选择器UISlider也有类似的令人沮丧的经历。其他人已经说salueDidChange是一个错字,但它不是唯一的问题。随着Swift的发展,selector的语法一直是新手(像我一样)的混乱之源。

选择器的正确语法在this answer中的一个坚果shell中解释了一个无关的问题。

  

“使用#selector会在编译时检查你的代码以确保代码   要调用的方法实际存在。更好的是,如果方法   如果不存在,您将收到编译错误:Xcode将拒绝构建   你的应用程序,因此无法忘记另一个可能的错误来源。“

您的问题以及此处的答案帮助我在Swift 3 下面中找到了有效的解决方案。

import UIKit

class ViewController: UIViewController {

@IBOutlet weak var ValueLabel: UILabel!

var slider: UISlider!

override func viewDidLoad() {
    super.viewDidLoad()

    slider = UISlider(frame: CGRect(x: 100, y: 100, width: 200, height: 23))
    slider.minimumValue = 0
    slider.maximumValue = 100
    view.addSubview(slider)

    slider.center = view.center

    slider.value = slider.maximumValue / 3.0

    slider.addTarget(self, action: #selector(sliderValueChanged), for: UIControlEvents.valueChanged)
    slider.isContinuous = false

    changeColor()
    thumbImage()
    }


func sliderValueChanged(sender: UISlider){
    print(sender.value)

//        ValueLabel.text = "\(sender.value)" // Note: not included in this test!!!

    }

func changeColor(){
    slider.maximumTrackTintColor = UIColor.red
    slider.minimumTrackTintColor = UIColor.green
    }

func thumbImage(){
    slider.setThumbImage(UIImage(named: "thumbNormal"), for: UIControlState.normal)
    slider.setThumbImage(UIImage(named: "thumbHighlighted"), for: UIControlState.highlighted)
    }

}