使用其他对象时未执行UIButton目标操作

时间:2017-01-12 05:51:47

标签: ios iphone swift uibutton

我在我的代码中使用生成按钮,并在按下按钮时使用addTarget()方法打印“Hi”。代码如下。

override func viewDidLoad() {
    super.viewDidLoad()
    let smartCarRequest = SmartCarOAuthRequest(clientID: "", redirectURI: "smartcar://oidc.com", scope: ["read_vehicle_info", "read_odometer"], development: true)

    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    appDelegate.smartCarSDK = SmartCarOAuthSDK()
    let sdk = appDelegate.smartCarSDK
    var ui = SmartCarOAuthSDK()

    print(sdk!)
    print(ui)

    ui.generateButton(for: OEM(oemName: OEMName.mock), in: self.view.subviews[0])
}

目前,sdk和ui变量都是SmartCarOAuthSDK对象。但是使用sdk变量生成按钮和动作会成功执行动作,而使用ui变量则不会打印“Hi”。生成按钮的代码如下。

class SmartCarOAuthSDK {

    init() {
    }

    func generateButton(for oem: OEM, in view: UIView) -> UIButton {
        let button = UIButton(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height))
        button.backgroundColor = hexStringToUIColor(hex: oem.oemConfig.color)
        button.setTitle("LOGIN WITH " + oem.oemName.rawValue.uppercased(), for: .normal)
        button.layer.cornerRadius = 5

        button.addTarget(self, action: #selector(pressed(_:)), for: .touchUpInside)

        view.addSubview(button)
        return button
    }  

    @objc func pressed(_ sender: UIButton) {
        print("Hi")
    }
}

有没有人能回答为什么会这样?

2 个答案:

答案 0 :(得分:0)

问题是ui变量在viewDidLoad完成后就会消失。

为避免这种情况,您需要将变量声明为类级变量。

答案 1 :(得分:0)

变量" ui"是属于方法" viewDidLoad()"的本地对象。它将在viewDidLoad结束后销毁。这就是ui变量不再起作用的原因。