2017-04-15 12 views
0

私はUIButtonsのセットを管理するカスタムコントローラを構築しようとしています。UIButtonターゲットを別のクラスに設定できません。

ボタンが設定され、配置のViewController:

override func viewDidLoad() { 
    super.viewDidLoad() 

    let button1 = UIButton() 
    button1.setTitle("Button 1", for: UIControlState.normal) 
    button1.setTitleColor(UIColor.blue, for: UIControlState.normal) 
    button1.frame.origin.y = 120 
    button1.sizeToFit() 
    button1.isUserInteractionEnabled = true 

    let button2 = UIButton() 
    button2.setTitle("Button 2", for: UIControlState.normal) 
    button2.setTitleColor(UIColor.blue, for: UIControlState.normal) 
    button2.frame.origin.y = 160 
    button2.sizeToFit() 


    let button3 = UIButton() 
    button3.setTitle("Button 3", for: UIControlState.normal) 
    button3.setTitleColor(UIColor.blue, for: UIControlState.normal) 
    button3.frame.origin.y = 190 
    button3.sizeToFit() 

    let controller = CustomButtonController(buttons: button1, button2, button3) 

    self.view.addSubview(button1) 
    self.view.addSubview(button2) 
    self.view.addSubview(button3) } 

CustomButtonController:

class CustomButtonController : NSObject { 
    init(buttons: UIButton...) { 
     super.init() 
     for aButton in buttons { 
      aButton.addTarget(self, action: #selector(pressed(_:)), for: UIControlEvents.touchUpInside) 
     } 
    } 

    func pressed(_ sender: UIButton) { 
     print("Press received in CustomButtonController") 
     //Never gets called 
    } 
} 

私はViewControllerを内側からボタンをaddTargetメソッドを使用している場合は、それが正常に動作します。 UIButtonに渡されたターゲットにターゲットを追加できない理由は何ですか?ありがとう

+0

私の目を引くものがNSObjectのサブクラス化されます。私は状況に応じて、あなたとは異なる2つの方法を取る傾向があります。 (1)ボタンを作成してその上にターゲットを追加したい場合は、*便利初期化子*を作成し、* target *と* selector *の両方を渡します。 (2)ボタンが押されたという事実を渡したいのであれば、私はそれにタグを付け、(b)代わりにボタンの* .sendAction *を使う。多分これらの方法の1つがあなたのために働くことができます。 – dfd

+0

悪魔は詳細です。これを呼び出す特定の一連の呼び出しを表示する必要があります。どのオブジェクトが誰を作成していますか?誰がCustomButtonControllerを呼び出していますか?私の推測では、View Controllerのビューがロードされる前にCustomButtonControllerを呼び出しているということです。 –

+0

@DuncanC初期化コードを追加します。ボタンinitで何も問題がないとは思わないでください。オブジェクトが初期化され、正常に渡されると、CustomButtonControllerは各ボタンでaddTarget()を実行しています。セレクタを呼び出さないだけです。 – user339946

答えて

2

CustomButtonControllerをローカル定数としてviewDidLoadに作成しています。 viewDidLoadが返されるとすぐに、このオブジェクトは解放され、ボタンタップを処理することはもうありません。

あなたは、コントローラのインスタンスを保持するために、インスタンスプロパティを宣言する必要があります:

var controller: CustomButtonController! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let button1 = UIButton() 
    button1.setTitle("Button 1", for: UIControlState.normal) 
    button1.setTitleColor(UIColor.blue, for: UIControlState.normal) 
    button1.frame.origin.y = 120 
    button1.sizeToFit() 
    button1.isUserInteractionEnabled = true 

    let button2 = UIButton() 
    button2.setTitle("Button 2", for: UIControlState.normal) 
    button2.setTitleColor(UIColor.blue, for: UIControlState.normal) 
    button2.frame.origin.y = 160 
    button2.sizeToFit() 


    let button3 = UIButton() 
    button3.setTitle("Button 3", for: UIControlState.normal) 
    button3.setTitleColor(UIColor.blue, for: UIControlState.normal) 
    button3.frame.origin.y = 190 
    button3.sizeToFit() 

    controller = CustomButtonController(buttons: button1, button2, button3) 

    self.view.addSubview(button1) 
    self.view.addSubview(button2) 
    self.view.addSubview(button3) 
} 
+0

うん、私は同じことをしようとしていたが、あなたは私にそれを打つ。 (Voted。) 'CustomButtonController'への強い参照を保持しないと、それは解放されます。 –

関連する問題