在 viewController 中添加地点的评论

Adding place's review in a viewController

我想在我的 viewController 中添加一个地方的评论(我正在处理 google 个地方 API),像这样 enter image description here

并按照 google 地点文档 (https://developers.google.com/places/web-service/details),我创建了一个 viewController,里面只有一个标签和这段代码(现在我试图只显示文本和作者姓名)但是不起作用(而且,我不知道标签是否适合做这种事情),有什么问题,我该如何调整?

//更新

//ViewController

import UIKit
import SwiftyJSON
import GooglePlaces
import Alamofire

private let RIdentifier = "myReviewTableCell"


class ReviewClass: UIViewController, UITableViewDelegate, UITableViewDataSource {



    @IBOutlet weak var RtableView: UITableView!
    @IBOutlet weak var myReview: UILabel!

    var places:[QPlace] = []
    var index2:Int = -1






    override func viewDidLoad() {
        super.viewDidLoad()

        guard index2 >= 0, places.count > 0 else {
            return
        }
        let place = places[index2]

        myReview.text = place.name

    }

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



    // TABLE VIEW





    func numberOfSections(in tableView: UITableView) -> Int {

        print("numberOfsection Call")
        return 1
    }




    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

       return 1
    }




    public  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: RIdentifier, for: indexPath) as! myReviewTableCell

        let place = places[index2]

        cell.revSelect(place: place)

       return (cell)
    }

 }

// 自定义 TableViewCell

import UIKit

private let json = """
{
"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
}
]
}
"""

class myReviewTableCell: UITableViewCell {


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

     var place: QPlace?




    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:QPlace) {



        NearbyPlaces.getPlaceDetails(place: place) { (place) in
            DispatchQueue.main.async {
                if let review = place.details?[json] as? [String:Any] {
                    do {
                        if let data = json.data(using: .utf8) {
                            let decoder = JSONDecoder()
                            let decoded = try decoder.decode(Response.self, from: data)
                            print(decoded.reviews)
                 // revText ??
                 // revAuthor ??
                        } else {
                            print("data is not available")
                        }
                    } catch (let e) {
                        print(e)
                    }
                }
            }
        }
    }
}

struct Response: Codable {

    struct Review: Codable, CustomStringConvertible {

        let text: String
        let authorName: String

        var description: String {
            return "Review text: \(text) authorName: \(authorName)"
        }

        enum CodingKeys: String, CodingKey {
            case text
            case authorName = "author_name"
        }
    }

    let reviews: [Review]
}

您上面显示的代码有很多问题,可能会给您带来一些问题。这里有一些 notes/tips 可以帮助你。

  1. 您需要设置 tableView 委托和数据源(通常为自己)
  2. tableView 的数据应该是当前地点的一组评论,例如 var reviews = [Review]()
  3. 您不需要let place = places[index2]myReview.text = place.name
  4. 你的 numberOfRowsInSection 函数应该 return self.reviews.count
  5. 您的 tableViewCell 不应发出 API 获取其数据的请求。
  6. 在视图控制器中提出您的 API 请求。解析响应,然后设置 self.reviews = 来自 API.
  7. 的结果数据
  8. 您的 cellForRowAt 函数应该使单元格出队,从评论数组中获取评论信息并将数据分配给单元格。

示例 cellForRow

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: RIdentifier, for: indexPath) as! myReviewTableCell

    let review = reviews[indexPath.row]
    cell.authorNameLabel.text = review.authorName
    return cell
}

当你加载这个视图控制器时,你应该 pass/set 这个地方(你可以转到这个视图控制器,然后在 prepareForSegue 中设置这个地方)然后一旦你有了这个就向 API 并获取该地点的所有评论。那是 tableView 的数据。

如果我这样做,我的方法会是这样的..

class ReviewsTableViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!

    var place: Place?
    var reviews = [Review]()

    override func viewDidLoad() {
        super.viewDidLoad()

        guard let place = self.place else { return }

        tableView.dataSource = self
        tableView.delegate = self

        // not exact syntax, doing this from memory
        Alamofire.request(urlForApiRequest).responseJSON {
           // parse the json response to get review models using JSONDecoder()
           self.reviews = reviews
           self.tableView.reloadData()
        }
    }
}

然后为了澄清,我会在下面为每个代表提供扩展

extension ReviewsTableViewController: UITableViewDataSource, UITableViewDelegate {
   // table view functions in here
}