【问题标题】:UISlider and UILabel cause infinite loopUISlider 和 UILabel 导致无限循环
【发布时间】: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 等价物)。

标签: ios swift xcode uilabel uislider


【解决方案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

    【讨论】:

      猜你喜欢
      • 2018-10-15
      • 1970-01-01
      • 1970-01-01
      • 2020-08-27
      • 2021-05-07
      • 2012-08-24
      • 2020-11-16
      • 1970-01-01
      相关资源
      最近更新 更多