2016-11-02 11 views
0

UICollectionViewCellUIButtonがあり、JSONからデータが取得されています。今度は、各ボタンからURLを開く必要があります(各ボタンにはJSONの別のURLがあります)。CollectionViewCellのUIButtonからURLを開きます

私はURLを開くために管理:

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

しかし、今、私はちょっと、各ボタンにURLを渡す必要があります。どのように私はこれを達成することができますの任意のアイデア?

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

をそしてそれに対応するURLのインデックスに各ボタンのタグプロパティを割り当てる:

+0

代理人を使用する必要があります。この記事をチェックしてください:http://stackoverflow.com/questions/24099230/delegates-in-swift – Eeshwar

答えて

1

あなたは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) 
} 

EDIT

他の解決策は、単にセル自体にURLを保存することで、ボタンのハンドラ内でそのセルに対応するURLを開くでしょう。それ以外の場合は、単にUIApplication.shared.openを使用

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 
     } 
    } 

+1

考慮すべき点がいくつかあります。これは、各ボタンのタグを0からn - 1(nはボタンの数)に設定することを前提としています。タグが明示されていないビューのデフォルトは0です。タグ値が0になるのを避けるのが最善です。さらに重要なことは、ボタンのタグに依存することは危険であるということです。コレクションビューが動的(セルの追加、削除、並べ替えなど)の場合など、多くの状況で失敗します。 – rmaddy

+0

@rmaddyええ、そうです。私はこのプロパティをあまり使いたくないのですが、何度か役立ちます。ヒントをお寄せいただきありがとうございます "明示タグのないビューでは0のタグがデフォルトです。タグ値0に頼らないようにすることをお勧めします。私は本当にバグを避けるのに役立ちます –

+0

別の解決策:UIButtonのサブクラスを作成してプロパティのURLを作ることができないのはなぜですか?各URLにそれを割り当てます。 –

0

FYI OpenURLのはiOSの10で廃止されますが、IOSの古いバージョンをサポートする必要がある場合、私は次のことを示唆しています。また、私はtableViewCellに渡すデータモデルにURLフィールドを追加し、モデルからURLを検索します。

関連する問題