2017-02-03 15 views
2

我有以下代码创建并向视图添加滑块和标签。只要我移动滑块,它会在AppDelegate类中提供一个SIGABRT并进入一个无限循环。我不明白我在做什么错误(如果我只添加它工作正常滑块)UISlider和UILabel导致无限循环

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 
} 
+1

在'-drawRect:'方法内调用'-addSubview:'不是最好的主意;您应该将这些行放入视图生命周期中的不同位置,例如到'-didMoveToSuperview'或'-willMoveToSuperview:'(或者他们的Swift等价物,当然)。 – holex

回答

2

如果您的函数需要一个值,则需要在引用它时输入:

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

,除非你需要做一些定制的渲染不覆盖的drawRect。将子视图添加到init的末尾。

+0

没有,但没有修复它。我仍然有一个无限循环。 – user35202

1

斯威夫特3+
由于斯威夫特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