为什么这个快速按钮设置崩溃?

时间:2015-08-30 03:27:05

标签: swift uibutton uikit

我尝试以编程方式向视图添加按钮及其操作方法。关键是action方法应该与按钮位于同一个文件中,这样我就可以将文件放到其他应用程序中了。当点击按钮时,我希望执行动作方法,但它会崩溃。它只是给EXC_BAD_ACCESS没有日志输出。

这是一个只有两个类的简化测试应用程序:ViewController和BlueButton:

import UIKit

class ViewController: UIViewController {

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        let button = BlueButton(mainView: view)
        button.installButton()
    }
}

class BlueButton: NSObject {

    var mainView: UIView

    init(mainView: UIView) {
        self.mainView = mainView
    }

    func installButton() {
        let button = UIButton(frame: CGRect(x: 25, y: 100, width: 150, height: 50))
        button.setTitle("Tap Me", forState: UIControlState.Normal)
        button.setTitleColor(UIColor.blueColor(), forState: UIControlState.Normal)
        button.addTarget(self, action: "someAction", forControlEvents: .TouchUpInside)
        mainView.addSubview(button)
    }

    func someAction() {
        println("this is someAction")
    }
}

返回跟踪显示没有任何帮助。它以objc_msgSend结尾。我尝试了许多不同的重新排列代码的方法,但我没有尝试过。我添加了一个“所有异常”#39;断点,但它没有被击中。我在someAction方法上加了一个断点,以确保它没有被调用 - 它不是。有人可以告诉我发生了什么吗?

1 个答案:

答案 0 :(得分:2)

BlueButton实例在viewDidAppear返回时被解除分配,因为不再有强引用。

当点击按钮时,它会尝试引用该实例,但它已被解除分配,从而导致崩溃。

您可以通过多种方式解决问题。最简单的方法是在ViewController类中创建一个属性,只要该按钮可见,就将BlueButton存储在其中。