簡體   English   中英

在集合視圖的筆尖內將addTarget更改為按鈕動作

[英]addTarget to button action within nib of collection view

我在iOS 11中有一個鍵盤擴展程序,其中包括來自JSON的文章的集合視圖。 我在原型單元格中有一個按鈕,我希望允許用戶按下該按鈕以在鍵盤外部的Safari中打開文章。 我可以用它打開靜態URL中的所有鏈接,但是我不能用它打開每篇文章的URL。 我想念什么?

我舉了一個簡單的靜態動作示例,還包括了我嘗試過但在此代碼中不起作用的內容:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        if(collectionView == self.key.colImages)
        {


            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "gifCollectionViewCell", for: indexPath) as! gifCollectionViewCell
            cell.lblTitle.text = self.articles[indexPath.row].headline
            let prefix: String = "https://res.cloudinary.com/djvbbwrnm/image/fetch/"
            let options: String = "w_0.2/"
            if let imageURL =  self.articles[indexPath.row].imageURL
            {

                let articleURL = self.articles[indexPath.row].url
                let url = URL(string: articleURL!)
                let urlAppended = prefix+options+imageURL
                cell.imgView.sd_setImage(with: URL(string: urlAppended), completed: nil)

                //This works 
                cell.shareButton.addTarget(self, action: #selector(openLink), for: .touchUpInside)

                //This doesn't
                cell.shareButton.addTarget(self, action: #selector(openUrl(url: url)), for: .touchUpInside)

            }

            return cell
        }
        else
        {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "catCollectionViewCell", for: indexPath) as! catCollectionViewCell
            cell.imgView.image = buttPics[indexPath.row]
            cell.imgView.layer.cornerRadius = 2
            cell.imgView.layer.masksToBounds = true
        return cell
        }

    }

      @objc func openLink(){
        let articleURL = "http://google.com"
        let url = URL(string: articleURL)
        openUrl(url: url)

    }

       @objc func openUrl(url: URL?) {
        let selector = sel_registerName("openURL:")
        var responder = self as UIResponder?
        while let r = responder, !r.responds(to: selector) {
            responder = r.next
        }
        _ = responder?.perform(selector, with: url)
    }

您不能添加任何其他數據DataTypes作為參數。 因為,您要為UIButton添加addTarget。

@objc func openLink(){

}

@objc func openLink(sender: UIButton){ // URL is not possible.

}

以上兩個代碼是相同的。 在第二篇中,您可以訪問UIButton's property

可運行代碼

  func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    if(collectionView == self.key.colImages)
    {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "gifCollectionViewCell", for: indexPath) as! gifCollectionViewCell
        cell.lblTitle.text = self.articles[indexPath.row].headline
        let prefix: String = "https://res.cloudinary.com/djvbbwrnm/image/fetch/"
        let options: String = "w_0.2/"
        if let imageURL =  self.articles[indexPath.row].imageURL
        {

            //let articleURL = self.articles[indexPath.row].url
            //let url = URL(string: articleURL!)
            let urlAppended = prefix+options+imageURL
            cell.imgView.sd_setImage(with: URL(string: urlAppended), completed: nil)

            //This works 
            cell.shareButton.addTarget(self, action: #selector(openLink), for: .touchUpInside)

            //This doesn't
            //cell.shareButton.addTarget(self, action: #selector(openUrl(url: url)), for: .touchUpInside)

            cell.shareButton.tag = indexPath.row // SET TAG TO UIBUTTON

        }

        return cell
    }
    else
    {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "catCollectionViewCell", for: indexPath) as! catCollectionViewCell
        cell.imgView.image = buttPics[indexPath.row]
        cell.imgView.layer.cornerRadius = 2
        cell.imgView.layer.masksToBounds = true
    return cell
    }

}


@objc func openLink(sender: UIButton){ // USE THIS.

     let buttonTag : Int = sender.tag
     let articleURL = self.articles[buttonTag].url
     let url = URL(string: articleURL!)
     // You can achieve by this way.

    // Since I am in a keyboard extension, I added the follwoing code and it is working now.
   let selector = sel_registerName("openURL:")
    var responder = self as UIResponder?
    while let r = responder, !r.responds(to: selector) {
        responder = r.next
    }
    _ = responder?.perform(selector, with: url)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM