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