动态添加UIButton:操作未注册

时间:2015-06-25 15:30:16

标签: ios swift cocoa-touch hyperlink uibutton

我动态创建页面,每个页面都包含一个导航控制器和UIViewController。

在每个页面中,都有链接,图像,文本等组件。

每个组件都是如下所示的类:

class link: Component, ComponentProtocol {
    var text: String
    var url: String

    func browseURL(sender: UIButton!){
        let targetURL = NSURL(fileURLWithPath: self.url)
        let application = UIApplication.sharedApplication()
        application.openURL(targetURL!)
    }

    func generateView() -> UIView?{
        var result: UIView?
        var y = CGRectGetMinY(frame)
        var linkBtn = UIButton(frame: CGRect(x: 0, y:30 , width:300 , height: 50)
        linkBtn.setTitle(self.text, forState: UIControlState.Normal)
        linkBtn.setTitleColor(UIColor.blueColor(), forState: UIControlState.Normal)
        linkBtn.titleLabel?.font = linkBtn.titleLabel?.font.fontWithSize(15)

        // this doesn't seem to be registered properly
        linkBtn.addTarget(self, action: "browseURL:", forControlEvents: UIControlEvents.TouchUpInside)

        result = UIView()
        result?.addSubview(linkBtn)

        return result
}

然后在页面ViewController方法的ViewDidLoad中,我将初始化页面组件:

    for component in components!{
        if let acomponent:ComponentProtocol = component as? ComponentProtocol {
            if let res = acomponent.generateView(innerFrame) {
                if let view = res.view {
                    self.view.addSubview(view)
                }
            }
        }
    }

按钮显示,但是当我触摸时没有任何反应。当我调试时,browseURL根本没有被触发。

我的代码出了什么问题?我猜是因为我在link课程中注册了该操作,而不是在页面的ViewController中注册?

更新

这可能是一个类似的问题,但答案并不那么简单,我实际上在ViewController中有组件引用:(Target: Object) not working for setting UIButton from outside viewController

1 个答案:

答案 0 :(得分:0)

我现在不在Mac上,所以我无法测试,但这样做有效:

linkBtn.target = self
linkBtn.action = "browseURL:"

我认为如果你在Swift中有选择器,你必须小心冒号并指定@objc如果你的类没有从NSObject继承,它也可能与它有关吗?