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 更新