UISlider 和 UILabel 导致无限循环

Posted

技术标签:

【中文标题】UISlider 和 UILabel 导致无限循环【英文标题】:UISlider and UILabel cause infinite loop 【发布时间】:2017-02-03 16:10:56 【问题描述】:

我有以下代码可以创建滑块和标签并将其添加到视图中。只要我移动滑块,它就会在 AppDelegate 类中给出一个 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: 方法中调用-addSubview: 并不是最聪明的主意;您应该将这些行放在视图生命周期中的不同位置,例如进入 -didMoveToSuperview-willMoveToSuperview:(当然也可以是它们的 Swift 等价物)。 【参考方案1】:

如果你的函数需要一个值,你需要在引用它的时候加上一个:

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

【讨论】:

【参考方案2】:

除非您需要进行一些自定义渲染,否则不要覆盖 drawRect。将添加子视图移动到 init 的末尾。

【讨论】:

做到了,但没有解决。我仍然得到一个无限循环。【参考方案3】:

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

【讨论】:

以上是关于UISlider 和 UILabel 导致无限循环的主要内容,如果未能解决你的问题,请参考以下文章

在 UISlider 的缩略图上不断更改 UILabel 的值

以编程方式在 UITableViewCells 中嵌入多个 UISlider 和 UILabel 控件

自定义 tableviewcell 上的 UISlider 和 UILabel 在第二次播放音频之前不会使用 avaudioplayer 更新

UISLider 以正确的方式改变 UILabel 的值

如何将 UISlider 设置为 UILabel 中的数字?

在 UISlider Thumb 上的 UILabel