簡體   English   中英

如何使用Swift 4.2將具有可編碼結構的JSON響應加載到tableview中?

[英]How to load JSON response with codable structure into tableview using Swift 4.2?

我的情況是,我正在嘗試為JSON響應創建Codable 我已經完成了可codable結構,但是我不知道如何將其loadtableview 在這里,每當我選擇多個tableview單元格時,我都需要獲取所有選定的單元格數據的username和用戶ID。 我不知道如何開始,請給我一些建議。

我的回復

{
    "status": 200,
    "user_list": [
        {
            "user_id": “1234”,
            "permission": 1,
            "active": 1,
            "user": {
                "firstname": “jack”,
                "lastname": “m”
            }
        },etc,...
        ]
}

我的可編碼伴侶

struct Welcome: Codable {
    let status: Int
    let userList: [UserList]

    enum CodingKeys: String, CodingKey {
        case status
        case userList = "user_list"
    }
}

struct UserList: Codable {
    let userID: String
    let permission, active: Int
    let user: User

    enum CodingKeys: String, CodingKey {
        case userID = "user_id"
        case permission, active, user
    }
}

struct User: Codable {
    let firstname, lastname: String
}

首先,我將您的UserList模型重命名為User ,將User重命名為Name (並將此屬性重命名為name……然后您可以重命名Name的屬性)

struct Welcome: Codable { // you can avoid using `CodingKeys` here since you can
    let status: Int       // set `keyDecodingStrategy` of decoder which does work 
    let userList: [User]  // for you
}

struct User: Codable {
    let userId: String
    let permission, active: Int
    let name: Name

    enum CodingKeys: String, CodingKey {
        case name = "user"
        case permission, active, userId
    }
}

struct Name: Codable {
    let first, last: String
}

然后,我認為在您的情況下, UITableView數據源數組應僅包含用戶,因此...您的User模型。

var users = [User]()

那么您可以將此數組分配為解碼后的響應的userList屬性

do {
    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase
    let decoded = try decoder.decode(Welcome.self, from: someData)
    self.users = decoded.userList
} catch { print(error) }

現在,對於確定行數的UITableView數據源方法,使用用戶數

func numberOfSections(in tableView: UITableView) -> Int {
    return users.count
}

對於cellForRowAt使用特定用戶

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    ...
    let user = users[indexPath.row]
    // e.g. let firstname = user.name.first
    ...
}

您的API調用應返回一個Data對象。 要解析它,您可以使用:

 func parseWelcome(dataFromServer:Data,handlerDone: @escaping (_ welcome:Welcome) ->Void) ->Void {
    do {
        let welcome = try JSONDecoder().decode(Welcome.self, from:jsonData!)
        handlerDone(welcome)
    } catch {

        // A handler could be defined here for handeling bad response from server
        print("API:An error occurred while parsing server response Welcome")
    }
}

調用該函數並從服務器傳遞您的rawData。 我得出結論,您在某處有一個User數組,所以讓我們填充它

parseWelcome(dataFromServer: rawData!) { parsedData in

   // Users should be an Array of Users defined by you somewhere
   users = parsedData.userList
}

調用tableView並從用戶數組中加載數據

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        // create a new cell if needed or reuse an old one
        let cell = tableView.dequeueReusableCell(withIdentifier: "notes", for: indexPath)

        // Construct your cell on your needs use users[indexPath.row]
        ...
}

但我同意@Robert Dresler的觀點,認為您的模型設計不佳。 建議重新設計一下。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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