Laden Sie eine NSURL schnell aus einer JSON-Datei und verknüpfen Sie sie mit einer imageView

MNM

Ok, ich versuche, einen "Pfad", der eine URL aus einer JSON-Datei ist, abzurufen und mit einer imageView in meinem Projekt zu verknüpfen. Das Bild und der Pfad kommen in einer json-Zeile wie dieser

{image:"http//www.something.com", path:"http://www.godbsdahb.com" }

Ich habe es geschafft, eine Bildlaufansicht mit den Bildern herunterzuladen und auszufüllen, aber jetzt möchte ich auf die Bilder klicken und dann zu einer anderen URL umleiten. Ich verwalte die Umleitung, aber nicht die Verknüpfung des Pfades zum Bild. Ich bin verloren darin, wie man das macht. Jede Hilfe wird geschätzt. Hier ist, was ich bisher habe und es funktioniert auch, aber es gibt keine Verbindung zum Pfad und zum Bild.

Vielen Dank für jede Hilfe dabei:

Hier ist der Code dafür:

    var numOfPromo = 0;

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

private func loadPromo() {
    numOfPromo = 0;
    PromoMan.sharedInstance.getAllPromoFromServer({
        promotions in
        for (_,promotion) in promotions {
            self.downloadImage(NSURL(string: promotion.picture)!)
            //The path for the promo is promotion.path
        }},
        onFail: { error_code, detail in Utility.log(self.dynamicType, msg: "Get All Promotions Fail, error_code: \(error_code), detail: \(detail)",
            function: "viewDidLoad")})
}

//Add paths to the promtion images
func imageTapped(gesture: UIGestureRecognizer)
{
    let url = NSURL(string: "http://google.com/")
    UIApplication.sharedApplication().openURL(url!)
}

func downloadImage(url: NSURL){
    getDataFromUrl(url) { (data, response, error)  in
        dispatch_async(dispatch_get_main_queue()) { () -> Void in
            guard let data = data where error == nil else { return }

            let tapGesture = UITapGestureRecognizer(target: self, action: #selector(PromotionViewController.imageTapped))
            let imageView = UIImageView(image: UIImage(data: data));
            imageView.addGestureRecognizer(tapGesture)
            imageView.userInteractionEnabled = true

            imageView.frame = CGRect(x: 0,
                y: Int(self.numOfPromo * 230), width: Int(self.pScrollView.frame.size.width), height: 200)
            self.pScrollView.addSubview(imageView)
            self.numOfPromo = self.numOfPromo + 1;

            //Make sure the images will all fit into the scrollview

            self.pScrollView.contentSize = CGSizeMake(self.pScrollView.frame.size.width,
                CGFloat(self.numOfPromo * 230));
        }
    }
}

func getDataFromUrl(url:NSURL, completion: ((data: NSData?, response: NSURLResponse?, error: NSError? ) -> Void)) {
    NSURLSession.sharedSession().dataTaskWithURL(url) { (data, response, error) in
        completion(data: data, response: response, error: error)
        }.resume()
}

AKTUALISIEREN:

Hier sind die http-Aufrufe für die Bilder und Daten

 public func getAllPromotionsFromServer(
    onSuccess: (promotions: [String: Promotion])->(),
    onFail: (error_code: APIErrorCode, detail: String)->()){

        let url = Config.getBaseUrl() + "/promotions"

        Utility.log(self.dynamicType, msg: "Get All Promotions from Server", function: "getAllPromotionsFromServer")

        APIManager.sharedInstance.get(url,params: nil,completion: { response in
            //Change back to global queue
            dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0), {
                switch response {

                case APIResult.Failure(let error):

                    let msg = "Get Promotions Fail"
                    Utility.log(self.dynamicType, msg: msg, function: "getAllPromotionsFromServer")

                    let code = Utility.getAPIErrorCode(error)
                    onFail(error_code: code.error_code, detail: code.detail)
                    return

                case APIResult.Success(let response):

                    if response.HTTP_Status == 200
                    {
                        let promotions = APIJSONParser.parsePromotions(response.jsonData)
                        print("Json response")
                        print(response.jsonData)
                        Utility.log(self.dynamicType, msg: "Get Promotions Success: no. \(promotions.count)", function: "getAllPromotionsFromServer")
                        onSuccess(promotions: promotions)
                        return

                    }
                    else{
                        let code = Utility.getAPIErrorCode(response)
                        onFail(error_code: code.error_code, detail: code.detail)
                        return
                    }

                }
            })
        })

}

}}

Aktualisieren:

Neuer Codeblock

 private func loadPromotions() {
    numberPromotions = 0;
    PromotionManager.sharedInstance.getAllPromotionsFromServer({
        promotions in
        for (_,promotion) in promotions {
            Utility.log(self.dynamicType, msg: promotion.picture, function: "viewDidLoad")

            let p = (picture: promotion.picture, path: promotion.path)
            self.promos.append(p)
            self.downloadImage(NSURL(string: promotion.picture)!, index: self.promos.count)
            //The path for the promo is promotion.path
        }},
        onFail: { error_code, detail in Utility.log(self.dynamicType, msg: "Get All Promotions Fail, error_code: \(error_code), detail: \(detail)",
            function: "viewDidLoad")})
}

//Add paths to the promtion images
func imageTapped(gesture: UITapGestureRecognizer)
{
            //let url = NSURL(string: "http://google.com/")
            //UIApplication.sharedApplication().openURL(url!)
    if let imageView = gesture as? UIImageView
    {
        if let url = NSURL(string: self.promos[imageView.tag].path)
        {
            UIApplication.sharedApplication().openURL(url)
        }
    }


}

func downloadImage(url: NSURL, index : Int){
    getDataFromUrl(url) { (data, response, error)  in
        dispatch_async(dispatch_get_main_queue()) { () -> Void in
            guard let data = data where error == nil else { return }

            let tapGesture = UITapGestureRecognizer(target: self, action: #selector(PromotionViewController.imageTapped))
            let imageView = UIImageView(image: UIImage(data: data));
            imageView.addGestureRecognizer(tapGesture)
            imageView.userInteractionEnabled = true
            imageView.tag = index
            //get images with a space between them 
            //200 = no space
            //230 = black space
            imageView.frame = CGRect(x: 0,
                y: Int(self.numberPromotions * 230), width: Int(self.promotionsScrollView.frame.size.width), height: 200)
            self.promotionsScrollView.addSubview(imageView)
            self.numberPromotions = self.numberPromotions + 1;

            //Make sure the images will all fit into the scrollview

            self.promotionsScrollView.contentSize = CGSizeMake(self.promotionsScrollView.frame.size.width,
                CGFloat(self.numberPromotions * 230));
        }
    }
}
Vladimir Nul

Wenn Sie das promotionsObjekt (die analysierten JSON-Daten) erhalten, haben Sie dort Bild und Pfad.

Sie verwenden bereits ein Bild, um die Bilder in der Bildlaufansicht anzuzeigen.

Jetzt müssen Sie dem Gestenerkenner mitteilen, dass er zu dem bestimmten Pfad gehen soll, der zu diesem Bild gehört. Da Sie eine Gestenerkennung für alle Bilder haben (was perfekt ist), müssen Sie die Bilder "irgendwie" mit den Pfaden verknüpfen.

Dazu können Sie im Bereich der Klasse eine Variable erstellen, beispielsweise ein Wörterbuch, in dem Sie alle Werbeaktionen mit ihren Bildern und Pfaden speichern.

Ich werde ein Array von Tupeln verwenden, aber Sie können jeden gewünschten Datentyp verwenden (Wörterbuch, Array usw.).

private var promos = Array<(picture: String, path: String)>()

Speichern Sie in Ihrer for-Schleife die Daten in der gerade erstellten Variablen:

for (_, promotion) in promotions {
    let p = (picture: promotion.picture, path: promotion.path)
    self.promos.append(p)
    self.downloadImage(NSURL(string: promotion.picture)!, index: self.promos.count - 1)
}

Jetzt müssen Sie jedem mitteilen, UIImageViewzu welchem ​​Index des promosArrays es gehört, bevor Sie es zur Bildlaufansicht hinzufügen (möglicherweise nach dem Einstellen userInteractionEnabled:

imageView.tag = index

Und das müssen Sie indexals Parameter der Funktion hinzufügen :

func downloadImage(url: NSURL, index: Int) { ... }

Und jetzt können Sie über die Gestenerkennungsaktion darauf zugreifen:

func imageTapped(gesture: UIGestureRecognizer)
{
    if let imageView = gesture.view as? UIImageView {
        if let url = NSURL(string: self.promos[imageView.tag].path) {
            UIApplication.sharedApplication().openURL(url)
        }
    }
}

Ich schlage vor, zu wechseln gesture, senderda dies sinnvoller wäre.

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

TOP Liste

  1. 1

    So legen Sie mit dem Interface Builder unterschiedliche führende Speicherplätze für unterschiedliche Geräte fest

  2. 2

    Wie konvertiere ich einen Vektor von Bytes (u8) in eine Zeichenfolge?

  3. 3

    Wie kann ich in SCSS mehrere Klassen zu einer einzigen kombinieren?

  4. 4

    Eclipse Oxygen - Projekte verschwinden

  5. 5

    Wie konvertiert man einen Datenrahmen im langen Format in eine Liste mit einem geeigneten Format?

  6. 6

    Wie kann ich den Kaskadenmodus global einstellen?

  7. 7

    Wie erstelle ich einen neuen übergeordneten Knoten außerhalb der .ref (/ path) in der Firebase-Echtzeitdatenbank mithilfe von Cloud-Funktionen (Typescript)?

  8. 8

    So erhalten Sie eine gleichmäßige Höhe für alle Eingabefelder

  9. 9

    Python: Spalten mit demselben Namen zusammenführen, wobei der Mindestwert beibehalten wird

  10. 10

    Speichern Sie ein MPAndroidChart-Diagramm in einem Bild, ohne es in einer Aktivität anzuzeigen

  11. 11

    Gruppieren Sie Datenrahmenspalten nach ihrem Datum (die Spaltentitel enthalten) und fassen Sie die Instanzen von Einsen und Nullen in R . zusammen

  12. 12

    ElasticSearch BulkShardRequest ist aufgrund von org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor fehlgeschlagen

  13. 13

    Tic Tac Toe-Spiel im React-Reset-Button funktioniert nicht

  14. 14

    Tomcat - Leiten Sie den alten Kontextstamm zum neuen Kontextstamm um

  15. 15

    Wie wählt man Unterschiede mit drei Tabellen aus?

  16. 16

    Ärgerliches Problem mit yaml, das ich nicht lösen kann

  17. 17

    Wie kann ich meine Tabelle abfragen, um sie in mySQL nach 2 Feldern zu gruppieren?

  18. 18

    So berechnen Sie die Verfügbarkeit von Anwendungen (SLA)

  19. 19

    Fügen Sie eine weitere Schaltfläche zu gwt Suggest Box hinzu

  20. 20

    Modbus Python Schneider PM5300

  21. 21

    Wie kann eine gleichmäßige Lastverteilung in ElasticSearch mit Indizes mit unterschiedlicher Anzahl von Shards erreicht werden?

heißlabel

Archiv