読者です 読者をやめる 読者になる 読者になる

【swift】カスタムUIView上のボタンが押せなくてハマったときのメモ

swift iPhoneアプリ開発 ios

はじめに

久々にこんなにハマりました、、、
共通で使い回すために作るカスタム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)
}

かなり試行錯誤したけどこんな結末とは、、、
以上です