UISlider 和 UILabel 导致死循环
UISlider and UILabel cause infinite loop
我有以下代码可以创建滑块和标签并将其添加到视图。一旦我移动滑块,它就会在 AppDelegate class 中给出一个 SIGABRT 并进入无限循环。我不明白我做错了什么(如果我只添加滑块就可以正常工作)
class test: UIView {
var value: Float
override func drawRect(rect: CGRect) {
self.addSubview(getSlider())
self.addSubview(getLabel())
}
override init(frame: CGRect) {
value = 0.9
super.init(frame:frame)
}
func getSlider()-> UISlider {
let slider: UISlider = UISlider(frame: CGRectMake(10,10,self.frame.width,30))
slider.addTarget(self, action:"change", forControlEvents:UIControlEvents.ValueChanged)
return slider
}
func getLabel()-> UILabel {
let label = UILabel(frame: CGRectMake(10,50,50,50))
label.text = "\(value)"
return label
}
func change(sender: UISlider) {
value = sender.value
}
除非您需要进行一些自定义渲染,否则不要覆盖 drawRect。将子视图添加到 init 的末尾。
如果您的函数需要一个值,您需要在引用它时放置一个:
。
slider.addTarget(self, action:"change:", forControlEvents:UIControlEvents.ValueChanged)
Swift 3+
自 Swift 3+ 起,选择器声明和实现已更改。
slider.addTarget(self, action:#selector(self.change), forControlEvents:UIControlEvents.ValueChanged)
@objc func change(sender: UISlider) {
value = sender.value
print("sender.value - \(sender.value)")
}
另请注意,从您的代码中删除 drawRect
。
我有以下代码可以创建滑块和标签并将其添加到视图。一旦我移动滑块,它就会在 AppDelegate class 中给出一个 SIGABRT 并进入无限循环。我不明白我做错了什么(如果我只添加滑块就可以正常工作)
class test: UIView {
var value: Float
override func drawRect(rect: CGRect) {
self.addSubview(getSlider())
self.addSubview(getLabel())
}
override init(frame: CGRect) {
value = 0.9
super.init(frame:frame)
}
func getSlider()-> UISlider {
let slider: UISlider = UISlider(frame: CGRectMake(10,10,self.frame.width,30))
slider.addTarget(self, action:"change", forControlEvents:UIControlEvents.ValueChanged)
return slider
}
func getLabel()-> UILabel {
let label = UILabel(frame: CGRectMake(10,50,50,50))
label.text = "\(value)"
return label
}
func change(sender: UISlider) {
value = sender.value
}
除非您需要进行一些自定义渲染,否则不要覆盖 drawRect。将子视图添加到 init 的末尾。
如果您的函数需要一个值,您需要在引用它时放置一个:
。
slider.addTarget(self, action:"change:", forControlEvents:UIControlEvents.ValueChanged)
Swift 3+
自 Swift 3+ 起,选择器声明和实现已更改。
slider.addTarget(self, action:#selector(self.change), forControlEvents:UIControlEvents.ValueChanged)
@objc func change(sender: UISlider) {
value = sender.value
print("sender.value - \(sender.value)")
}
另请注意,从您的代码中删除 drawRect
。