好吧我正在尝试在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)
}
}
答案 0 :(得分:2)
使用slider.addTarget(self, action: "sliderValueChanged:", forControlEvents: UIControlEvents.ValueChanged)
,您告诉Swift在ViewController上调用方法sliderValueChanged:
,但ViewController中没有这样的方法。这就是错误告诉你的内容。您最有可能为同一目的撰写salueDidChange
,因此您应将salueDidChange
重命名为sliderValueChanged
并添加@IBAction
。
如果这不起作用,请尝试从故事板中连接事件处理程序:
slider.addTarget
代码行。x
删除它。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)
}
}