#arrays #swift #uitableview #decodable
#массивы #swift #uitableview #декодируемый
Вопрос:
Это ответ API, который я проанализировал
{
"status": 0,
"message": "Friends found.",
"friends": [
{
"id": 52,
"meetings": [
{
"id": 47,
"meeting_with": "Bbb"
}
]
}
]
}
Класс модели
struct TotalMeetings: Decodable {
var status: Int
var message: String
var friends: [FriendDetail]?
}
struct FriendDetail: Decodable {
var id: Int
var meetings: [MeetingsDetail]
}
struct MeetingsDetail: Decodable {
var id: Int
var meeting_with: String
}
Я вызываю API здесь, и вызов выполнен успешно.
var meetingssData :Friends!
let decoder = JSONDecoder()
do{
meetingsData = try decoder.decode(TotalMeetings.self, from: response.data!)
let meet = [self.meetingsData!.friends].compactMap({$0}).flatMap({$0})
print(meetingsData!)
}catch{
print(error)
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! FriendsMeetingTVC
return cell
}
Пожалуйста, подскажите мне, как мне заполнить tableview ответом, поступающим от вызова API.
Комментарии:
1. Я знаю, как создать tableview, я спрашиваю, как мне передать эти данные в tableview, какой подход будет использоваться?
2. Даже не ясно, что вы хотите отобразить. Для источника данных в виде таблицы требуется как минимум массив источников данных.
3. Ваша
meetingsData
должна быть переменной экземпляра, а не локальной, чтобыcellForRowAt
можно было использовать массивFriendDetail
. (Предполагая, что вы хотите показать друзей в своей таблице.)
Ответ №1:
-
вы должны объявить экземпляр массива типа в соответствии с вашими потребностями либо FriendDetail, либо MeetingsDetail.
-
После извлечения данных из api проанализируйте их и сохраните сопоставленные данные в экземпляре массива. Затем перезагрузите табличное представление.
-
numberOfRowsInSection метод tableview возвращает количество строк, используя ваш счетчик массивов.
-
Вы можете получить доступ к значению, используя точечную нотацию, как показано в методе «cellForRowAt indexPath:».
class MeetingVC: UIViewController, UITableViewDelegate, UITableViewDatasource { var friendsArr = [FriendDetail]() func fetchFriendDetail() { let decoder = JSONDecoder() do { let meetingsData = try decoder.decode(TotalMeetings.self, from: response.data!) self.friendsArr = meetingsData.friends ?? []//[meetingsData.friends].compactMap({$0}).flatMap({$0}) print(self.friendsArr) self.tableView.reloadData() }catch{ print(error) } } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return friendsArr.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! FriendsMeetingTVC cell.emailTxt.text = friendsArr[indexPath.row].email return cell } }
Комментарии:
1. эй, это очень полезно и работает. Пожалуйста, один вопрос, как мне получить доступ к значениям [MeetingsDetail]
2. То же, что электронная почта:- friendArr[indexPath.row].meetings.
3. пусть meetingId = friendsArr[indexPath.row].meetings[indexPath.row].id я пытаюсь это сделать, но он показывает индекс ошибки вне диапазона