UIButtonのaddTargetがうまくいかない
環境:Mac/High Sierra 10.13.6/swift4.2/xcode 10.0
下記コードでUIButtonをaddSubviewした時に、うまく動きません。
ViewController上でUIButtonを直接定義するとうまく動くことが確認できました。
また、BulbSwitchButtonクラス内のイニシャライザでViewControllerを引数で指定して、プロパティに追加(weak var vc:ViewController)すればうまくいくことも確認しました。
ただ、下記コードのようにViewController上で、他クラスのUIButtonプロパティをaddSubview()した時に、クリックしてもBulbSwitchButtonクラスのaction()が動作しない理由がわかりませんでした。
ViewController.swift
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
Logger.debug(Logger.Message.START_FUNCTION.rawValue)
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
var bulb = Bulb(id: 1, state: true)
var bulbSwitch = BulbSwitchButton(bulb: bulb)
bulbSwitch.button.frame = CGRect(x: 0, y: 0, width: self.view.bounds.width/7, height: self.view.bounds.height/7)
bulbSwitch.button.center = self.view.center
self.view.addSubview(bulbSwitch.button)
Logger.debug(Logger.Message.END_FUNCTION.rawValue)
}
@objc func testAction(_ sender:UIButton){
Logger.debug(Logger.Message.START_FUNCTION.rawValue)
Logger.debug(Logger.Message.END_FUNCTION.rawValue)
}
}
Bulb.swift
import Foundation
import UIKit
class Bulb{
let id:Int
var state:Bool = false
var image:UIImage?
var imageView:UIImageView = UIImageView()
var onFilename:String = "on"
var offFilename:String = "off"
init(id:Int){
Logger.debug(Logger.Message.START_FUNCTION.rawValue)
self.id=id
self.setImage()
Logger.debug(Logger.Message.END_FUNCTION.rawValue)
}
init(id:Int,state:Bool){
Logger.debug(Logger.Message.START_FUNCTION.rawValue)
self.state=state
self.id=id
self.setImage()
Logger.debug(Logger.Message.END_FUNCTION.rawValue)
}
func setImage(){
Logger.debug(Logger.Message.START_FUNCTION.rawValue)
if self.state{
self.image = UIImage(named: self.onFilename)
self.imageView.image = self.image
}else{
self.image = UIImage(named: self.offFilename)
self.imageView.image = self.image
}
Logger.debug(Logger.Message.END_FUNCTION.rawValue)
}
func on(){
Logger.debug(Logger.Message.START_FUNCTION.rawValue)
self.state = true
setImage()
Logger.debug(Logger.Message.END_FUNCTION.rawValue)
}
func off(){
Logger.debug(Logger.Message.START_FUNCTION.rawValue)
self.state = false
setImage()
Logger.debug(Logger.Message.END_FUNCTION.rawValue)
}
func setOnOff(state:Bool){
Logger.debug(Logger.Message.START_FUNCTION.rawValue)
if state{
self.on()
}else{
self.off()
}
Logger.debug(Logger.Message.END_FUNCTION.rawValue)
}
}
class BulbSwitchButton{
let bulb:Bulb
let id:Int
var filename:String = "back"
let button:UIButton = UIButton()
init(bulb:Bulb){
Logger.debug(Logger.Message.START_FUNCTION.rawValue)
self.bulb = bulb
self.id = self.bulb.id
self.button.addTarget(self, action: #selector(action(_:)), for: .touchUpInside)
self.button.setImage(UIImage(named: filename), for: .normal)
Logger.debug(Logger.Message.END_FUNCTION.rawValue)
}
@objc func action(_ sender:UIButton){
Logger.debug(Logger.Message.START_FUNCTION.rawValue)
Logger.debug(Logger.Message.END_FUNCTION.rawValue)
}
}