我动态创建页面,每个页面都包含一个导航控制器和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
答案 0 :(得分:0)
我现在不在Mac上,所以我无法测试,但这样做有效:
linkBtn.target = self
linkBtn.action = "browseURL:"
我认为如果你在Swift中有选择器,你必须小心冒号并指定@objc如果你的类没有从NSObject继承,它也可能与它有关吗?