在 tableView 中显示用户评论

Posted

技术标签:

【中文标题】在 tableView 中显示用户评论【英文标题】:Display the users reviews in a tableView 【发布时间】:2018-02-14 12:00:40 【问题描述】:

我正在尝试在 tableView 中添加从 google 地方 API 获取的用户评论

"reviews" : [
         
            "author_name" : "Robert Ardill",
            "author_url" : "https://www.google.com/maps/contrib/106422854611155436041/reviews",
            "language" : "en",
            "profile_photo_url" : "https://lh3.googleusercontent.com/-T47KxWuAoJU/AAAAAAAAAAI/AAAAAAAAAZo/BDmyI12BZAs/s128-c0x00000000-cc-rp-mo-ba1/photo.jpg",
            "rating" : 5,
            "relative_time_description" : "a month ago",
            "text" : "Awesome offices. Great facilities, location and views. Staff are great hosts",
            "time" : 1491144016
         
      ],

https://developers.google.com/places/web-service/details,现在我只尝试添加评分、作者姓名和文本,这是我的自定义 tableViewCell

import UIKit




class myReviewTableCell: UITableViewCell 


    @IBOutlet weak var revText: UITextView!
    @IBOutlet weak var revRating: UIImageView!
    @IBOutlet weak var revAuthor: UILabel!

     var place: EClass?




    override func awakeFromNib() 
        super.awakeFromNib()
        // Initialization code
    

    override func setSelected(_ selected: Bool, animated: Bool) 
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    




    func revSelect(place:Eclass) 



        NearbyPlaces.getPlaceDetails(place: place)  (place) in
            DispatchQueue.main.async 
                if let rev = place.details?["reviews"] as? [String:Any] 




                
            
        
    

我需要在哪里正确构建func revSelect(place:Eclass),然后在我的 cellForRowAt 中调用它。我已经尝试添加其他参数,例如

if (place.details?["website"] as? String) != nil 
                self.webButton.isHidden = false
                  
               else 
                self.webButton.isHidden = true
            


            if let phoneNumber = place.details?["international_phone_number"] as? String 
                self.myLabel4.text = "\(phoneNumber)"
            
            else 
                self.myLabel4.isHidden = true
              
         
      

它们工作得很好,但评论是一个数组所以不同,我也尝试遵循参数“几何”的逻辑

if let g = placeInfo["geometry"] as? [String:Any] 
            if let l = g["location"] as? [String:Double] 
                if let lat = l["lat"], let lng = l["lng"] 
                    location = CLLocationCoordinate2D.init(latitude: lat, longitude: lng)
                
            
        

我在另一个课程中添加了,但它不起作用。那么我必须在我的 func revSelect 中做些什么来制作 rev.Author.text = "author_name" , revText = "text" 等?? (我之前已经问过这个问题,但我无法解决问题)

//更新

这是我用来获取地点详细信息的函数

static func getPlaceDetails(place:EClass, completion: @escaping (EClass) -> Void) 

        guard place.details == nil else 
            completion(place)
            return
        

        var params : [String : Any]
        params = [
            "key" : AppDelegate.googlePlacesAPIKey,
            "placeid" : place.placeId,
        ]

        Alamofire.request(googlePlaceDetailsHost, parameters: params, encoding: URLEncoding(destination: .queryString)).responseJSON  response in
            let value = response.result.value as? [String : Any]
            place.details = (value)?["result"] as? [String : Any]
          /*  print(((value)?["result"] as? [String : Any] ?? [String : Any]()).debugDescription) */
            completion(place)
        
    

【问题讨论】:

【参考方案1】:

您只需要研究 Swift 中的 JSON 解析。这article 会是一本好书。

一旦您了解了 JSON 的结构,它就很容易阅读。您只需要正确映射每种类型。 Swift 4 引入了 Codable 协议,当与 JSONDecoder 结合使用时,您可以更好地解析和使用这些数据。

struct Response: Codable 
    var reviews: [Review]


struct Review: Codable 

    var authorName: String
    var authorUrl: String
    var rating: Int
    var text: String

    enum CodingKeys: String, CodingKey 
        case authorName = "author_name"
        case authorUrl = "author_url"
        case rating
        case text
    


let data = """

    "reviews" : [
        "author_name" : "Robert Ardill",
        "author_url" : "https://www.google.com/maps/contrib/106422854611155436041/reviews",
        "language" : "en",
        "profile_photo_url" : "https://lh3.googleusercontent.com/-T47KxWuAoJU/AAAAAAAAAAI/AAAAAAAAAZo/BDmyI12BZAs/s128-c0x00000000-cc-rp-mo-ba1/photo.jpg",
        "rating" : 5,
        "relative_time_description" : "a month ago",
        "text" : "Awesome offices. Great facilities, location and views. Staff are great hosts",
        "time" : 1491144016
    ]

""".data(using: .utf8)

guard let data = data else  throw NSError() 

let response = try? JSONDecoder().decode(Response.self, from: data)
let reviews = response?.reviews // array of reviews
let review = reviews?.first // first one from the list (if any)

print(review?.authorName)
print(review?.rating)

因此,使用上面的示例,我创建了一个 Review 类型并将该类型的属性映射到 JSON 响应中的类型。然后我们可以使用 JSONDecoder 为我们完成剩下的工作。

输出

可选的(“罗伯特·阿迪尔”)

可选(5)

更新:

您需要这样做,但您可能需要根据响应值更改结构结构。

Alamofire.request(googlePlaceDetailsHost, parameters: params, encoding: URLEncoding(destination: .queryString)).responseJSON  response in
    guard let data = response.data else  throw NSError() 

    let response = try? JSONDecoder().decode(Response.self, from: data)
    let reviews = response?.reviews // array of reviews
    completion(reviews?.first)

【讨论】:

好的,我看了一下这个,一个问题,这样做我得到了给定位置的正确结果吗?因为我已经尝试过,但给我的回应是存在的例子,所以例如作者姓名而不是给我评论的真实作者姓名,罗伯特阿迪尔给我的就是例子 看看我在哪里有 let data = """ 和 JSON 文本?忽略那部分。这只是我的测试 JSON 来举例。您使用从 API 返回的 JSON。我会在几分钟内更新答案 我已经更新了如何从 Alamofire 响应中获取 data 的示例。【参考方案2】:

你可以使用object mapper,github上有文档

【讨论】:

以上是关于在 tableView 中显示用户评论的主要内容,如果未能解决你的问题,请参考以下文章

如何组织表格视图单元格

didEndEditingRow未使用自定义tableview单元调用

无法显示跨到另一个 tableview 的 Tableview 和自定义表格单元格

可以从其他 ViewController 类更改 UILabel 的字体

在 UITableView 中选择一行时显示新视图

详细文本标签未显示