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));
}
}
}
Wenn Sie das promotions
Objekt (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, UIImageView
zu welchem Index des promos
Arrays es gehört, bevor Sie es zur Bildlaufansicht hinzufügen (möglicherweise nach dem Einstellen userInteractionEnabled
:
imageView.tag = index
Und das müssen Sie index
als 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
, sender
da 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.
Lass mich ein paar Worte sagen