2015-06-25 22 views
0

我正在動態創建頁面,每個頁面都包含一個導航控制器和UIViewController。動態添加UIButton:未註冊的動作

在每個頁面中,有鏈接,圖像,文本等組件。

每個組件是像一個類中的下列:

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中註冊了該動作?

UPDATE

這可能是一個類似的問題,但答案並非如此簡單,我其實在我的ViewController組件參考:在一臺Mac (Target: Object) not working for setting UIButton from outside viewController

+0

您是使用模擬器還是移動設備? – jperl

+0

@KickimusButticus移動設備 – yonasstephen

回答

0

我不是現在所以我無法測試,但確實這項工作:

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

我覺得如果你有選擇的斯威夫特,你必須要小心用冒號並指定@objc如果你的類沒有inheri t來自NSObject,它也可能與此有關?

+0

恐怕你的建議'linkBtn.action =「browseURL:」'不是一個有效的語法。我用UIBarButtonItem做了類似的想法。但是UIBarButtonItem動作註冊和處理函數都是在ViewController本身中定義的,並且它在沒有@objc的情況下完美工作。 – yonasstephen