[英]Swift4 UITableView: JSON data loading correctly but throwing error on assigning value
我有一些看起來像這樣的JSON數據
{
"fullName": "John Doe",
"imageUrl": "https://www.example.com/images/about/team/john.jpg",
"titles": [
"Founder & President",
"Advisor"
]
},
{
"fullName": "Jane Doe",
"imageUrl": "https://www.example.com/images/about/team/jane.jpg",
"titles": [
"Executive Vice President",
"Director of Advisor Services and Marketing"
]
},
數據被加載並正確解析,但是當我運行代碼時出現錯誤。 我認為這與具有多個標題的標題部分有關,並且它不知道如何正確顯示標題。
這是我的代碼。
這是初始結構。
import UIKit
class Managers: Codable {
let managers: [Manager]
init (managers: [Manager]) {
self.managers = managers
}
}
class Manager: Codable {
let imageUrl: String?
let fullName: String?
let titles: [titles]
init(imageUrl: String?, fullName: String?, titles: [titles]) {
self.imageUrl = imageUrl
self.fullName = fullName
self.titles = titles
}
struct titles: Codable {
let title: String
}
}
這是管理單元,顯示圖像,名稱和標題的布局。
import UIKit
class ManagementCell: UITableViewCell {
@IBOutlet weak var imageUrl: UIImageView!
@IBOutlet weak var fullNameLbl: UILabel!
@IBOutlet weak var titlesLbl: UILabel!
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
}
}
這是視圖控制器
import UIKit
class ManagementViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
final let url = URL(string: "Data from above goes here")
private var managers = [Manager]()
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
downloadJson()
tableView.tableFooterView = UIView()
}
func downloadJson() {
guard let downloadURL = url else { return }
URLSession.shared.dataTask(with: downloadURL) { data, urlResponse, error in
guard let data = data, error == nil, urlResponse != nil else {
print("Something went wrong")
return
}
print("downloaded")
do
{
let decoder = JSONDecoder()
let downloadedManagers = try decoder.decode([Manager].self, from: data)
self.managers = downloadedManagers
DispatchQueue.main.async {
self.tableView.reloadData()
}
} catch {
print("Something went wrong after download")
}
}.resume()
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return managers.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "ManagementCell") as? ManagementCell else { return UITableViewCell() }
cell.fullNameLbl?.text = managers[indexPath.row].fullName
cell.titlesLbl?.text = managers[indexPath.row].titles
if let imageURL = URL(string: managers[indexPath.row].imageUrl!) {
DispatchQueue.global().async {
let data = try? Data(contentsOf: imageURL)
if let data = data {
let image = UIImage(data: data)
DispatchQueue.main.async {
cell.imageUrl.image = image
cell.imageUrl.layer.cornerRadius = 60
cell.imageUrl.clipsToBounds = true
cell.imageUrl.contentMode = .scaleAspectFit
cell.imageUrl.backgroundColor = UIColor.lightGray
cell.imageUrl.layer.borderWidth = 5
cell.imageUrl.layer.borderColor = UIColor.clear.cgColor
}
}
}
}
return cell
}
這行代碼拋出錯誤:cell.titlesLbl?.text = manager [indexPath.row] .titles
錯誤是無法將類型'[Manager.titles]'的值分配為類型'String?'
有誰對此有解決方法。 我相信我必須為標題創建一個單獨的循環,因為它也具有一系列選項。 任何建議將不勝感激。
在單獨的圖片注釋中,如果缺少圖片,則會導致應用崩潰。 如果不存在JSON數據中的圖像,如何設置通用圖像?
因為managers[indexPath.row].titles
返回一個String
數組。 窺探數據,看起來該數組中的第一個標題是經理持有的最新標題。 您可以追加索引或調用.first
以獲得該標題:
cell.titlesLbl?.text = managers[indexPath.row].titles.first?.title
// or
cell.titlesLbl?.text = managers[indexPath.row].titles[0].title
// or to show all past titles, comma separated
cell.titlesLbl?.text = managers[indexPath.row].titles
.map({ $0.title })
.joined(separator: ", ")
區別在於,如果titles
數組為空,則.first
不會引發錯誤。 您將得到一個空白標簽。 如果您的數組為空,則[0]
將拋出索引超出范圍錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.