2016-11-02 47 views
0

我的UIButton在我的UICollectionViewCell中,它從JSON獲取數據。現在我需要從每個按鈕中打開一個URL(每個按鈕都有一個不同的URL,它也來自JSON)。從CollectionViewCell中的UIButton打開URL

我設法與打開的網址:

let weburl = "http://example.com" 
UIApplication.shared.openURL(URL(string: weburl)!) 

但現在我需要一個URL還挺傳遞給每個按鈕。我怎樣才能做到這一點的任何想法?

+0

您需要使用代表。看看這篇文章:http://stackoverflow.com/questions/24099230/delegates-in-swift – Eeshwar

回答

1

你可以有網址的數組:

let urls = [url1, url2, ...] 

,然後將每個按鈕的標籤屬性分配給其相應的URL的索引。現在,您可以輕鬆地管理你想要什麼:

@IBAction func handleTouch(_ sender: UIButton) { 
    // assumes that the buttons' tags start at 0, which isn't a good idea. 
    // see @rmaddy comment bellow 
    let url = urls[sender.tag] 
    // use the version of the open method shown bellow because the other one becomes deprecated in iOS 10 
    UIApplication.shared.open(URL(string: url)!, options: [:], completionHandler: nil) 
} 

編輯

其他的解決辦法是隻儲存在細胞本身的URL,並且在按鈕處理程序打開對應的單元格鏈接。

+1

有幾件事要考慮。假設您將每個按鈕的標記從0設置爲n - 1,其中n是按鈕的數量。 0標籤是任何視圖的默認值,沒有顯式標籤。最好避免依賴0的標籤值。更重要的是,依靠按鈕的標籤是有風險的。在很多情況下,如果集合視圖是動態的(單元可以添加,刪除或重新排序),它會失敗。 – rmaddy

+0

@rmaddy是的,你是對的。我不喜歡使用這個屬性太多,但有時它有幫助。感謝您的提示「標記爲0是任何視圖的默認值,沒有顯式標記,最好避免依賴標記值爲0。我真的幫助避免錯誤 –

+0

另一個soln:爲什麼我們不能創建一個UIButton子類並在那裏創建一個屬性url。併爲每個網址分配。 –

0

FYI的OpenURL在iOS的10棄用我建議如下,如果你需要支持舊版iOS:

let url = URL(string: "alexa://")! 
    if #available(iOS 10, *) { 
     UIApplication.shared.open(url, options: [:], completionHandler: { 
      (success) in 
      guard success else { 
       //Error here 
      } 
      //Success here 
     }) 
    } else { 
     if let success = UIApplication.shared.openURL(url) { 
      //Success here 
     } else { 
      //Error here 
     } 
    } 

否則只是使用UIApplication.shared.open。另外,我會爲您傳遞給您的tableViewCell的數據模型添加一個URL字段,並從模型中查找URL。