簡體   English   中英

Swift4 UITableView:JSON數據正確加載,但在分配值時引發錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM