[英]How to create search function for JSON codable structure data in TableView using Swift 4.2?
[英]How to load JSON response with codable structure into tableview using Swift 4.2?
我的情況是,我正在嘗試為JSON
響應創建Codable
。 我已經完成了可codable
結構,但是我不知道如何將其load
到tableview
。 在這里,每當我選擇多個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.