在 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 可以帮助你。
- 您需要设置 tableView 委托和数据源(通常为自己)
- tableView 的数据应该是当前地点的一组评论,例如
var reviews = [Review]()
- 您不需要
let place = places[index2]
或myReview.text = place.name
- 你的
numberOfRowsInSection
函数应该 return self.reviews.count
- 您的 tableViewCell 不应发出 API 获取其数据的请求。
- 在视图控制器中提出您的 API 请求。解析响应,然后设置 self.reviews = 来自 API.
的结果数据
- 您的 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
}
我想在我的 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 可以帮助你。
- 您需要设置 tableView 委托和数据源(通常为自己)
- tableView 的数据应该是当前地点的一组评论,例如
var reviews = [Review]()
- 您不需要
let place = places[index2]
或myReview.text = place.name
- 你的
numberOfRowsInSection
函数应该 returnself.reviews.count
- 您的 tableViewCell 不应发出 API 获取其数据的请求。
- 在视图控制器中提出您的 API 请求。解析响应,然后设置 self.reviews = 来自 API. 的结果数据
- 您的 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
}