【swift】カスタムUIView上のボタンが押せなくてハマったときのメモ
はじめに
久々にこんなにハマりました、、、
共通で使い回すために作るカスタムUIVIew上のボタンを押してもウンともスンともいわなかったことでした
コードは以下のような感じで、なんてことはなくボタンを持ってるだけのUIViewをaddSubViewして、見た目的には問題ないのにタップイベントが呼ばれない、、、
カスタムView
CustomView: UIView { var button = UIButton() override init(frame: CGRect) { super.init(frame: frame) setUp() } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) setUp() } func setData() { button.frame = CGRectMake(100, 100, 150, 150) button.setTitle("送信", forState: UIControlState.Normal) button.addTarget(self, action: "onButton:", forControlEvents: UIControlEvents.TouchUpInside) addSubview(self.button) } func onButton(sender: UIButton) { // 呼ばれない } }
呼び出し元ViewController
class ViewController: UIViewController { var customView: CustomView! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. customView = CustomView() customView.button.addTarget(self, action: "onButton:", forControlEvents: UIControlEvents.TouchUpInside) view.addSubview(self.customView) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func onButton(sender: UIButton) { // これも呼ばれない } }
今日1日近く悩んだあげくこちらの記事を見つけました。まさにここに書いてあるとおりでした
addSubViewしたUIButtonが押せない - 技術系備忘録
カスタムUIViewをaddSubViewするときにサイズをセットしていなかったため、親のビューが邪魔?してたみたいでした、、、
呼び出し元ViewController(修正後)
override func viewDidLoad() { super.viewDidLoad() customView = CustomView() customView.frame = CGRectMake(0, 0, view.frame.size.width, view.frame.size.height) // ★★ コレ!! ★★ customView.button.addTarget(self, action: "onButton:", forControlEvents: UIControlEvents.TouchUpInside) view.addSubview(self.customView) }
かなり試行錯誤したけどこんな結末とは、、、
以上です