2017-04-22 54 views
1

我有一個ButtonProvider類,它創建我的按鈕並添加目標操作。但是,按下按鈕時,它不會調用創建它的類ButtonProvider中的函數,而是調用另一個類中具有相同名稱的函數。UIButton從錯誤的類調用函數

class ButtonProvider { 

    let view: UIView! 
    let button: UIButton! 

    init(view: UIView) { 
     self.view = view 
    } 

    func showButton() { 
     button = UIButton(frame: CGRect(x: 0, y: 0, width: 50, height: 50)) 
     button.backgroundColor = .white 
     button.addTarget(self, action: #selector(ButtonProvider.close), for: .touchUpInside) 

     view.addSubview(button) 
    } 

    @objc func close() { 
     button.removeFromSuperview() 
    } 

} 

在我的呼喚ViewController

override func viewDidLoad() { 
    let buttonProvider = ButtonProvider(view: self.view) 
    buttonProvider.showButton() 
} 

@objc func close() { 
    //This is the function that is called 
} 

任何想法,爲什麼ButtonProvider.close的選擇叫我ViewController.close功能?

+1

那麼'buttonProvider'不會被保留,因此它會被釋放。我很驚訝應用程序不會崩潰。 – Sulthan

+0

爲什麼使用#selector(ButtonProvider.close)而不是#selector(close)? –

+0

@DmytroShvecov這是一樣的。 – Sulthan

回答

1

buttonProvider不是控制者所有的,因此只要viewDidLoad結束,它就會被重新分配。當按下按鈕時,實例不再存在於內存中,結果將是未定義的行爲,通常是崩潰。

您必須將buttonProvider保存爲控制器中的強大財產。

+0

非常感謝。很有幫助。 –