2017-06-29 14 views
0

ボタンを作成するカスタムクラスを作成しようとしています。クラス内のボタンにターゲットを追加するのに問題があります。これは私のコードですSwiftカスタムボタンクラス

class SelectButton{ 

     var button:UIButton = UIButton() 

     init(button_frame: CGRect, button_title: String, connected: [UIButton]?){ 
      self.button.frame = button_frame 
      self.button.setTitle(button_title, for: UIControlState.normal) 
      self.button.addTarget(self, action:#selector(self.buttonPressed), for: .touchUpInside) 
     } 

     func construct() -> UIButton { 
      return self.button 
     } 

     @objc func buttonPressed() { 
      print("Button Clicked") 
     } 
} 

問題は私がボタンクリックでアクションを接続できないということです。私のクラスの外で使用されていて、内部では使用されていない場合にはこれが機能

クラスの使い方

let test = SelectButton(button_frame: CGRect(x:50, y:50, width: 250, height:150), button_title: "Test button", connected: nil).construct() 
self.view.addSubview(test) 
+0

どのようにこのクラスを使用しているから直接SelectButton継承を持っていますか?そのコードを表示します。なぜあなたは 'UIButton'をサブクラス化しませんでしたか? – Paulw11

+0

'UIButton'をサブクラス化するよりも優れていると思うので私の質問を編集しました – AustinTc

+1

' TestButton'インスタンスへの強い参照を保持しているものは何もありません。サブビューとして追加したため、ボタン自体は保持されるため、まだ表示されていますが、アクションに応答するオブジェクトはなくなりました。本当に 'SelectButton'は' UIButton'をサブクラス化し、 'SelectButton'をサブビューとして追加することができます。 – Paulw11

答えて

0

誰かがボタンをタップすると、通常、あなたは(あなたのビューコントローラのいずれかで、またはいくつかの他のUI要素のように)自分のアプリでどこかに起こるために何かをしたいです。 IBActionの設定方法は、誰かがボタンをタップしたときにボタン自体の中で何かが発生するようにすることです。ボタンからビューコントローラにドラッグする代わりに、プログラムでボタンタップを処理したい場合は、好きなようにこの方法で行うことができます。まず、ビューコントローラにこのコードを追加します。

@IBAction func buttonPressed(sender: UIButton) { 

} 

次に、あなたがあなたのビューコントローラには、このメソッドを追加することで、プログラムセレクターを追加することができ、次のいずれか

myButton.addTarget(self, action:self.buttonPressed(sender), for: .touchUpInside) 

または接続インスペクタに行くとドラッグすることにより、あなたのビューコントローラコード内のタッチから内側のIBActionドットまで。また、他の誰かがあなたのボタンがあなたのクラス宣言にこれを追加することにより、UIButtonから継承させる必要があるコメントで指摘したように:

class SelectButton: UIButton { 
    . . . 
} 
0

何もあなたのSelectButtonインスタンスへの強い参照を保持していないので、できるだけ早く関数としてされますtest出口が作成され、そのインスタンスが解放されます。

ボタン自体はサブビューとして追加されているため、そのまま保持されます。したがって、それはまだ見ることができますが、もはやアクションに応答するオブジェクトはありません。

あなたはどちらかtestのインスタンスプロパティではなく、ローカル変数を使用する必要がある、または、好ましくはUIButton