2016-11-02 9 views
0

Ich habe eine UIButton in meinem UICollectionViewCell und es erhält Daten von JSON. Jetzt muss ich eine URL von jedem Knopf öffnen (jeder Knopf hat eine andere URL, die auch von JSON kommt).Öffnen Sie die URL von UIButton in CollectionViewCell

schaffte ich es mit der URL zu öffnen:

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

Aber jetzt muss ich irgendwie eine URL jeder Taste passieren. Irgendwelche Ideen, wie kann ich das erreichen?

+0

Sie müssen Delegaten verwenden. Schauen Sie sich diesen Beitrag an: http://stackoverflow.com/questions/24099230/delegates-in-swift – Eeshwar

Antwort

1

Sie können eine Reihe von Urls haben:

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

Und dann die Tag-Eigenschaft eines jeden auf den Index der entsprechenden URL-Taste zuweisen. Jetzt können Sie ganz einfach verwalten, was Sie wollen:

@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

Andere Lösung wäre, einfach die URL speichern in der Zelle selbst, und in dem Tastenhandler öffnen Sie die URL zu seiner Zelle entspricht.

+1

Ein paar Dinge zu beachten. Dies setzt voraus, dass Sie das Tag für jede Schaltfläche von 0 bis n - 1 setzen, wobei n die Anzahl der Schaltflächen ist. Ein Tag 0 ist der Standardwert für jede Ansicht ohne explizites Tag. Es ist am besten, sich nicht auf einen Tag-Wert von 0 zu verlassen. Noch wichtiger ist, dass es riskant ist, sich auf das Tag eines Buttons zu verlassen. Es schlägt unter vielen Umständen fehl, beispielsweise wenn die Sammlungsansicht dynamisch ist (Zellen können hinzugefügt, entfernt oder neu geordnet werden). – rmaddy

+0

@rmaddy Ja, du hast Recht. Ich mag es nicht, diese Eigenschaft zu sehr zu verwenden, aber manchmal hilft es. Danke für den Tipp "Ein Tag von 0 ist der Standard für jede Ansicht ohne explizites Tag. Es ist am besten, sich nicht auf einen Tag-Wert von 0 zu verlassen." Ich helfe wirklich, Bugs zu vermeiden –

+0

Eine andere Lösung: Warum können wir nicht eine UIButton-Unterklasse erstellen und eine Eigenschaft URL dort machen. und weisen Sie das mit jeder URL zu. –

0

FYI openURL in iOS veraltet ist 10. Ich schlage vor, die folgenden, wenn Sie ältere Versionen von ios unterstützen müssen:

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

Ansonsten nur UIApplication.shared.open verwenden. Außerdem würde ich ein URL-Feld zu dem Datenmodell hinzufügen, das Sie an Ihre tableViewCell übergeben, und einfach die URL aus dem Modell nachschlagen.

Verwandte Themen