【问题标题】:Taking the response of JSON and showing it in a textField获取 JSON 的响应并将其显示在 textField 中
【发布时间】:2017-10-31 07:14:24
【问题描述】:

此功能会将照片上传到存储桶,然后在文本字段中显示指向该照片的直接链接。我想做的是缩短链接,所以我使用 alamofire 创建了一个对 Google 的 URL 缩短器的发布请求,并且它有效,但我不知道如何在文本字段中显示它。

这里是函数

func ImageDownloader(){


    UIApplication.shared.isNetworkActivityIndicatorVisible = true

    let imageContained = viewimage.image

    let storage = Storage.storage()
    var storageRef = storage.reference()
    storageRef = storage.reference(forURL: "") // Link to bucket

    var data = NSData()
    data = UIImageJPEGRepresentation(imageContained!, 0.8)! as NSData
    let dateFormat = DateFormatter()
    dateFormat.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
    let imageName = dateFormat.string(from: NSDate() as Date)
    let imagePath = "images/\(imageName).jpg"
    let metaData = StorageMetadata()
    let mountainsRef = storageRef.child(imagePath).putData(data as Data, metadata: metaData){(metaData,error) in
        if let error = error {
            print(error.localizedDescription)
            return
        }else{
            //store downloadURL
            let downloadURL = metaData!.downloadURL()!.absoluteString
            self.getLink.text = downloadURL



                struct dlink {
                    let longLink: String
                }
                let v = dlink(longLink: "\(downloadURL)")

                let parameters = ["longUrl":"\(v.longLink)","MYURL":""]

                Alamofire.request("https://www.googleapis.com/urlshortener/v1/url?key=MY_KEY", method: .post, parameters: parameters, encoding: JSONEncoding.default).responseJSON { response in
                    print(response)
                }


            }
        metaData?.contentType = "image/jpeg"
        }

这是显示它工作正常的 JSON 响应。

任何形式的帮助都将不胜感激!

【问题讨论】:

    标签: json swift swift3 alamofire


    【解决方案1】:

    您需要访问responseresult.value 才能获得序列化的JSON 响应。

    Alamofire.request("https://www.googleapis.com/urlshortener/v1/url?key=MY_KEY", method: .post, parameters: parameters, encoding: JSONEncoding.default).responseJSON { response in
         if let dictionary = response.result.value as? [String:Any] {
             //Now subscript on dictionary with keys to get your values.
             let id = dictionary["id"] as? String ?? "DefaultValue" //set default value that you want
             let kind = dictionary["kind"] as? String ?? "DV"
             let longUrl = dictionary["longUrl"] as? String ?? "DV"
             print(id, kind, longUrl)
         }
    }
    

    您可以查看Alamofire 文档的Response Handling 部分以了解更多信息。

    【讨论】:

    • 成功了!非常感谢,我真的很感激:)
    【解决方案2】:

    您需要使用 JSONSerialization 来解析数据:

    let text = "{\"id\":\"https://link.right.here/\"}"
    
    do {
        let json = try JSONSerialization.jsonObject(with: text.data(using: .ascii)!, options: []) as! [String: Any]
        let id = json["id"] as? String
        print(id)
    } catch {
        print("Json parse failure")
        fatalError()
    }
    

    (不要忘记全局保存 id 变量,或者至少在 do/catch 语句之外)

    然后您将需要访问正在更改的文本字段。为此,您应该为情节提要中连接到视图控制器的文本字段创建一个出口。我不会讨论这个,因为这不是你的问题所要求的,因为那里有很多关于它的教程。重点工作是出路。

    假设outlet的名字是myTextfield,简单举例,你的代码应该是这样的:

    self.myTextfield.text = "\(id)"
    

    其中id 是在第一部分代码中设置的变量。

    【讨论】:

    • 感谢您的解释。有一件事我不明白。在常量文本中包含一个链接,应该在那里插入什么链接?
    • 我把伪数据写成 JSON,改用你的 JSON
    猜你喜欢
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 2017-02-16
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多