2017-02-03 14 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